2016-05-04 7 views
1

クラスのインスタンスが与えられた場合、プロパティの変更をどのように観察できますか?クラスインスタンスのプロパティの変更を観察する

その初期化機能でsdk.initialize(chatView)

が、私はホストアプリケーションのを追跡する必要があります。例えばのために 、私は次のようになります簡単なinplementationでより多くの機能を提供するために、ホストアプリのチャットビューを初期化するSDKを構築していますチャットビューのhiddenプロパティを使用して、SDKのビューが一致するようにします。

+0

'hidden'を使用した例でありますか?詳細を示し、コードをいくつか示してください – Wain

+0

クラス "A"のプロパティが、クラス "B"で何か起こることの価値を変えるとき、それを意味しますか? –

+0

@Peter M - そうです。 –

答えて

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() 
    } 
} 

これはあなたの構成に関するいくつかの仮定をしているが、あなたは多くのビューの初期化を許可している場合、あなたは簡単に調整することができます。

また、スウィフトにはないKVOControllerをFacebookで使用すると、これがより簡潔になります。

編集:ちょっとメモしてください。はKVOで動作しますか?

編集#2:SDKViewControllerに更新YourSDKClass(NSObjectの - >のUIViewController)

+0

私は興奮しています。これは私が必要なもののように見えます。しかし、私は "値のタイプ[コントローラ]にはメンバ"コンテキスト "がありません。 –

+0

UIViewで渡しているメンバ関数' initializeInputView'を持つSDKViewControllerがあります。 通知を受け取りたいUIViewの 'hidden'プロパティがホストアプリケーションから変更されたとき –

+0

ああ、SDKクラスが既にUIViewControllerであるという事実を回避する方法を見つけなければならない。NSObjectを追加すると複数の継承エラーが発生する。 ? –

0

hiddenプロパティ(UIViewインスタンス)を含むクラスの一般的なプロパティの変更を、Key Value Observing(KVO)を使用して監視できます。これは、NSKeyValueObservingプロトコルで定義されたaddObserver:forKeyPath:options:context:を使用して行われます。

ビューをスーパービューから削除するか、またはalphaをゼロに設定して、ビューを非表示にすることもできます。

+0

フレームワーク/モジュールとしてのUIKitはKVOに準拠していません。それがうまくいくか、そうでないかもしれません。私は特にKVOに '隠された 'とは試みていないが、UIKit全体はKVOに関してはヒットアンドミスである。 –

+1

@ReidBelton - 少なくとも「iOS 10」では「隠された」ことを確認できますが、UIKitはKVOのコンプライアンスを保証しないため、将来的には変更される可能性があります。 –

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 
    } 


} 
関連する問題