써니쿠키의 IOS 개발일기
[swift] KVO 구현하기 본문
KVO 구현하기
오늘은 KVO 예제를 만들어보았다텍스트필드
에 내용을 적은 후 등록버튼
을 누르면 밑에 있는 텍스트뷰에 똑같은 내용을 띄우는 코드이다.
1. 트랙킹 할 정보 지정하기
class Writhing: NSObject {
@objc dynamic var writedThing: String
init(writedThing: String) {
self.writedThing = writedThing
}
- 트랙킹 할 변수가 담겨있는 타입은 상속을 위해 Writing을 class타입으로 구현해줘야한다.
- class에서 NSObject를 상속받는다.
- 트랙킹 할 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
}
- 우선 Writing클래스를 인스턴스화 했고, 값이 똑같이 복사될 TextView도 outlet으로 연결해준다.
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