[英]Observe property change of class instance
給定一個類的實例,如何觀察屬性變化? 例如,我正在構建一個SDK,該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
設置為零來隱藏視圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.