簡體   English   中英

觀察類實例的屬性更改

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM