2017-11-17 11 views
2

私は、アプリケーションを通して使用/参照される変数をシングルトンパターンで持っています。共有インスタンス内で変数が変更されたときを知る方法を教えてください

変数を設定するカスタムビューがあるmainVCがあります。この変数が変更されたときに、ナビゲーションコントローラに表示されるビューコントローラに通知する必要があります。例えば

:私のmainVCで

それは私がView1をを押し組込みナビゲーションコントローラを持っています。 mainVCツールバーには、ユーザーが値を入力できるテキストフィールドがあります。この値が変更されると、View1に変更が加えられたことを知らせたいと思います。 View1は現在表示されている任意のビューです。

+0

キーバリュー観測? – matt

+0

はい。私はView1にaddObserverをしますか?これについての良い例はありますか? – Arcadian

+0

あなたは_how_にキー値観測を依頼していますか? https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html「Key-Value観察」で検索してください。 – matt

答えて

2

私はその変数にdidSet値オブザーバを作成します。任意のViewControllerが表示されたら、デリゲートをselfに設定します。 ViewControllerでその変数の変更を追跡します。

それぞれのViewControllerを行う必要があります。

class ViewController: UIViewController { 
    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 

     Singleton.shared.delegate = self 
    } 
} 

extension ViewController: SingletonDelegate{ 
    func variableDidChange(newVariableValue value: Int) { 
    //here u get value if changed 
    } 
} 

そしてシングルトンあなたの変数とプロトコル

protocol SingletonDelegate:class { 
    func variableDidChange(newVariableValue value:Int) 
} 

class Singleton { 

    var variable:Int = 0{ 
     didSet{ 
      delegate?.variableDidChange(newVariableValue: variable) 
     } 
    } 

    private init(){} 
    weak var delegate: SingletonDelegate? 

    static let shared = Singleton() 
} 

PDで:ナビゲーションの唯一のトップのViewControllerをnewValueにイベントを処理するこの方法に気づきます。

1

私はこのパターンを数回使用しましたが、私はNotificationCenterを使用することをお勧めします。

シングルトンクラスでは、値が変更されるたびにPostメソッドを使用する必要があります。また、ビューコントローラーでは、オブザーバーを追加して変更を反映または反映します。

これにはいくつかの方法があります。そしてそこには、同じことについてたくさんの素晴らしいチュートリアルがあります。

1

@mattのコメントに追加したいと思っていましたが、KVOはあなたの解決策を説明する方法の1つで、あなたの質問からは最良の方法だと思います。 @mattにリンクして使用するときに実装している "通常の" KVOを使用することができます。 KVO and Lazy Stored Properties

:この記事を読みながら

var testString: String = "Hello World" { 
    //After setting 
    didSet { 
     // Code you want to execute after a new value is set 
    } 

    //Prior to setting 
    willSet { 
     // Code you want to execute right before setting a new value 
    } 
} 

私はこれを見て:

はしかし、私はKVOはので、私はそれを共有したいと思った前に、私が知らなかったことを設定することができるという新しい方法を見つけました

関連する問題