给定一个类的实例,我如何观察属性变化? 例如,我正在构建一个SDK,用于初始化主机应用的聊天视图,以提供更多功能,并提供如下所示的简单实施:
sdk.initialize(chatView)
在初始化功能中,我需要跟踪主机应用的聊天视图的hidden
属性,以便SDK的视图匹配。
答案 0 :(得分:3)
观察隐藏的简单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 - &gt; UIViewController)
答案 1 :(得分:1)
以下是使用协议的示例
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
}
}
答案 2 :(得分:0)
您可以使用键值观察(KVO)来监视对类的常规属性的更改,其中包括hidden
个实例上的UIView
属性。这是使用addObserver:forKeyPath:options:context:
协议中定义的NSKeyValueObserving
完成的。
请注意,您也可以通过将视图从超级视图中删除或将其alpha
设置为零来隐藏视图。