观察类实例的属性变化



给定一个类的实例,如何观察属性的变化?例如,我正在构建一个SDK,它初始化主机应用程序的聊天视图,通过一个简单的实现提供更多功能,看起来像:

sdk.initialize(chatView)

在初始化函数中,我需要跟踪主机应用程序的聊天视图的hidden属性,以便SDK的视图匹配。

观察隐藏的简单KVO示例:

class SDKViewController : UIViewController {
    private var context = 0
    private var observingView: UIView?
    func initialize(view: UIView) {
        removeObservations()
        observingView = view
        // start observing changes to hidden property of UIView
        observingView?.addObserver(self, forKeyPath: "hidden", options: [.New], context: &context)
    }
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        if let newValue = change?[NSKeyValueChangeNewKey] as? Bool where context == &self.context {
            print("hidden changed: (newValue)")
        }
    }
    // this is called by deinit
    // it should also be called if they can deregister the view from your SDK
    func removeObservations() {
        if let view = observingView {
            view.removeObserver(self, forKeyPath: "hidden")
            observingView = nil
        }
    }
    deinit {
        removeObservations()
    }
}

这是对您的配置进行一些假设,但如果允许初始化许多视图,则可以轻松进行调整。

此外,如果你使用Facebook的KVOController,其中很多内容会更简洁,而Swift中没有。

编辑:需要注意的是,隐藏可以使用KVO。

编辑#2:将YourSDKClass更新为SDKViewController(NSObject->UIViewController)

以下是使用协议的示例

protocol MyClassDelegate:class {
    func myClassValueDidChange(newValue:Int)
}
class MyClass {
    weak var delegate:MyClassDelegate?
    var value = 0 {
        didSet {
            delegate?.myClassValueDidChange(value)
        }
    }
}

class ViewController:UIViewController,MyClassDelegate {
    let myClass = MyClass()
    override func viewDidLoad() {
        super.viewDidLoad()
        myClass.delegate = self
    }
    func myClassValueDidChange(newValue:Int) {
        //Do something
    }

}

您可以使用键值观测(KVO)来监视对类的常规属性的更改,其中包括UIView实例上的hidden属性。这是使用在NSKeyValueObserving协议中定义的addObserver:forKeyPath:options:context:来完成的。

请注意,也可以通过将视图从其超级视图中删除或将其alpha设置为零来隐藏视图。

最新更新