써니쿠키의 IOS 개발일기

[swift] KVO 구현하기 본문

swift, Ios

[swift] KVO 구현하기

sunnyCookie 2022. 9. 7. 15:09

KVO 구현하기

오늘은 KVO 예제를 만들어보았다
텍스트필드에 내용을 적은 후 등록버튼을 누르면 밑에 있는 텍스트뷰에 똑같은 내용을 띄우는 코드이다.

1. 트랙킹 할 정보 지정하기

class Writhing: NSObject {
    @objc dynamic var writedThing: String

    init(writedThing: String) {
        self.writedThing = writedThing
    }
  1. 트랙킹 할 변수가 담겨있는 타입은 상속을 위해 Writing을 class타입으로 구현해줘야한다.
  2. class에서 NSObject를 상속받는다.
  3. 트랙킹 할 writedThing 프로퍼티에 @objc attribute와 dynamic modifier 를 부여한다.
    (프로퍼티에 기본값이 없어서 init코드도 만들어주었다.)


2. 옵저버 생성

var observer: NSKeyValueObservation?

NSKeyValueObservation 타입의 변수를 만들어 준다.

let writing = Writhing(writedThing: "")

@IBOutlet weak var copyWriteField: UITextView!

// 등록버튼 안에 구현한 옵저버 내용의 일부 (전체코드는 하단에)
observer = self.writing.observe(\.writedThing, options: [.old, .new]) { object, change in
            guard let new = change.newValue else { return }
            guard let old = change.oldValue else { return }

            print("object: \(object), old: \(old), new: \(new)")
            self.copyWriteField.text = new
        }
  1. 우선 Writing클래스를 인스턴스화 했고, 값이 똑같이 복사될 TextView도 outlet으로 연결해준다.
  2. observe 메소드를 이용해 트랙킹내용을 적어준다. 이 때 아래 3개의 프로퍼티가 필요하다.
  • key Path : /.로 시작해서 트랙킹할 프로퍼티값을 적어준다
  • options : 무슨 정보를 가져올지 정해준다
    • old : 변화 전 값
    • new : 변화 후 값
    • initial : 초기화때 옵져버 핸들러를 호출할 것인지 정해주는것
    • prior : 변화 전 후 모두의 값
  • changeHandler : 클로저로 구현해준다첫번째 파라미터인 object는 트랙킹 하고 있는 클래스 인스턴스를 의미한다.
    object.name 이런 식으로 값을 가져올 수 있다.observer가 생성된 후 부터 트랙킹하는 프로퍼티 값이 변경되면 changeHandle 부분의 함수가 구현된다.
  • 두번째 파라미터인 change는 정보가 들어 있다.
    .oldvalue(변화전 값) .newvlaue(변화 후 값) 같이 접근 할 수 있다.
  • { (object, change) in 구현부 }

전체코드

  class Writhing: NSObject {
    @objc dynamic var writedThing: String

    init(writedThing: String) {
        self.writedThing = writedThing
    }
}

class ViewController: UIViewController {
    @IBOutlet weak var writeField: UITextField!
    @IBOutlet weak var copyWriteField: UITextView!

    let writing = Writhing(writedThing: "")
    var observer: NSKeyValueObservation?

    @IBAction func registerButtonOnTouched(_ sender: UIButton) {
        observer = self.writing.observe(\.writedThing, options: [.old, .new]) { object, change in
            guard let new = change.newValue else { return }
            guard let old = change.oldValue else { return }

            print("object: \(object), old: \(old), new: \(new)") // old랑 print 코드는 필요없지만 어떻게 뜨는지 궁금해서 넣었음
            self.copyWriteField.text = new
        }

        guard let writedThing = writeField.text else { return }
        writing.writedThing = writedThing
    }
}
반응형

'swift, Ios' 카테고리의 다른 글

[swift] singleton 쉬운 예제 구현해보기  (0) 2022.09.12
[swift] NotificationCenter 구현  (0) 2022.09.07
ios - Auto Layout (1)  (0) 2022.09.06
[swift]열거형 연관된 값(Associated Values)  (0) 2022.08.30
[swift] 제네릭? generic  (0) 2022.08.26
Comments