观察类实例的属性更改

时间:2016-05-04 13:56:42

标签: ios swift

给定一个类的实例,我如何观察属性变化? 例如,我正在构建一个SDK,用于初始化主机应用的聊天视图,以提供更多功能,并提供如下所示的简单实施:

sdk.initialize(chatView)

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

3 个答案:

答案 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设置为零来隐藏视图。