美文网首页
Swift中使用KVO

Swift中使用KVO

作者: AndyYaWei | 来源:发表于2018-09-13 11:35 被阅读0次

自己使用swift4.0写了一个例子

class FirstViewController: UIViewController {
    @objc dynamic var age = 0
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.white
        self.addObserver(self, forKeyPath: "age", options: [NSKeyValueObservingOptions.old, NSKeyValueObservingOptions.new], context: nil)
    }
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if keyPath == "age" {
            if let newValue = change?[NSKeyValueChangeKey.newKey] {
                print("age changed: \(newValue)")
            }
        }
    }
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.age += 1
    }

注意事项

  1. 观察者和被观察者都必须是 NSObject 的子类;
  2. 观察的属性需要使用 @dynamic 关键字修饰。
  • 条件1:观察者和被观察者都必须是NSObject的子类,因为OC中KVO的实现基于KVC和runtime机制,只有是NSObject的子类才能利用这些特性。
  • 条件2:要观察的属性使用@dynamic修饰,表示该属性的存取都由runtime在运行时来决定,由于Swift基于效率的考量默认禁止了动态派发机制,因此要加上该修饰来开启动态派发;除此之外,在NSObject子类中几乎没有属性默认是使用@dynamic修饰,所以若想对某个属性进行观察,还必须在当前的子类中override该属性,override时,采用super的实现即可。

相关文章

网友评论

      本文标题:Swift中使用KVO

      本文链接:https://www.haomeiwen.com/subject/nrqwgftx.html