给定一个类的实例,如何观察属性的变化?例如,我正在构建一个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
设置为零来隐藏视图。