前言
NSKeyValueObserving(KVO),一个非正式协议,用来通知指定对象的属性发生更改,该协议基本适用于大部分的控件
具体步骤
- 构建观察者对象
在控制器的生命周期内,创建一个对象来接收事件
注意必须创建一个观察事件对象,否则会在创建好观察事件后直接释放;
在控制器中不再需要单独释放该观察事件,该事件会在控制器销毁的观察事件对象时自动释放,相对的,你也可以提前将观察对象置空,从而提前释放观察事件
- 选择需要观察的参数类型
keyPath
针对不同的控件会有不同的对象,我们可以通过xcode编译器提示来选择对应的参数类型,这里我们用UIView视图控件来举例说明
可以看到这里涵盖了UIView的成员变量
- 选择观察对象的状态变更发送时机
NSKeyValueObservingOptions
.prior - 发生改变前
.old - 发生改变时,用于获取改变前的旧值
.new - 发生改变时,用于获取改变后的新值
.initial - 观察者注册返回之前,用于获取初始值 - 处理反馈结果
NSKeyValueObservedChange
isPrior - 是否发生改变前
newValue - 新值
oldValue - 旧值
这里的value使用泛型,会根据具体的类型匹配对应的类型值,无需手动进行类型转换
实际应用
- UITextField
var textfield = UITextField()
var observation: NSKeyValueObservation?
func createObserver() {
observation = observe(\.isEditing, options: [.new]) { uitextfield, change in
let prior = change.isPrior
let oldBool = change.oldValue
let newBool = change.newValue
}
}
func removeObserver() {
observation = nil
}
- UIView
var vview = UIView()
var observation: NSKeyValueObservation?
func createObserver() {
observation = vview.observe(\.frame, options: [.new]) { uiview, change in
let prior = change.isPrior
let oldRect = change.oldValue
let newRect = change.newValue
}
}
- UIViewController
var vc = UIViewController()
var observation: NSKeyValueObservation?
func createObserver() {
observation = vc.observe(\.view.bounds, options: [.new]) { viewcontroller, change in
let prior = change.isPrior
let oldRect = change.oldValue
let newRect = change.newValue
}
}