2016-12-31 5 views
0

View Controller Aはモデルにアクセスでき、モデルを変更することができます。 View Controller Bはモデルを表示します。 View Controller Aがモデルを更新するときに、ビューが更新されるようにView Controller Bでトリガーされるメソッドが必要です。 Swiftでこれを行う標準的な方法はありますか?モデルを更新して、別のコントローラで迅速に更新をトリガする方法

答えて

2

この変数の通知では通知を送信でき、他のコントローラはこの通知に登録できます。

+0

マイモデルは、クラスまたは構造体のいずれかとして表すことができます。構造体の場合、2つのコントローラは同じ参照を共有できません。通知の上に構造体を渡す必要がありますか?それがクラスなら、どのようにしてdidSetを追加できますか? (これは、クラスの "mutating"に似たような印象を与えているようには見えないからです)。あるいは、モデルを所有しているビューコントローラではなくモデルの内部で作成する必要がありますか? – Puzzler3141

+0

サブプロパティの変更を通知する場合は、構造体を使用する必要がありますが、あなたが言ったように共有しませんが、クラスではすべてのプロパティdidSetに書き込む必要があります。 –

0

モデルオブジェクトをObjective-Cオブジェクト(@objc)にすると、KVO(キー値オブザーバリング)を使用してモデルオブジェクトの変更を観察することができます。これを行うと、そのプロパティが変更されたときにモデルのプロパティを監視しているオブジェクトに通知が送られます。

0

これはあなたがこれを行う方法の1つです。

ビューコントローラBが使用できるプロトコルを実装するクラス、構造体を使用してください。ビューコントローラBは、モデルが何であるかを気にする必要はなく、必要なプロトコル必要なデータを抽出します。

ビューコントローラAがモデルを操作するとき、userInfoディクショナリに、プロトコルのインスタンスとしてモデルへの参照を含む通知を投稿します。ビューコントローラBは、通知を購読し、トリガされると、userInfoから参照を抽出し、共通プロトコルを介して必要なデータを取得します。

0

2つのビューコントローラ間で通信するもう1つの方法は、プロトコルです。

weak var updatedProtocol: viewControllerAModelDidUpdate? 

モデルが更新され、呼び出している場合:

updatedProtocol?.viewControllerAModelDidUpdate() 

をViewControllerBにおいて、プロトコルを実装

ViewControllerAで
protocol ViewControllerAModelProtocol: class { 
    func viewControllerAModelDidUpdate() 
} 

は、デリゲート型を定義:のようなプロトコルを定義します:

class ViewControllerB: UIViewController, ViewControllerAModelProtocol { 

    func viewControllerAModelDidUpdate() { 
     // reloadData() 
    } 

} 

ViewControllerBが提示されるまたは示さViewControllerAにより、BにAのupdatedProtocolに設定されている場合:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    if let b = segue.destination as? ViewControllerAModelProtocol { 
     self.updatedProtocol = b 
    } 

} 
関連する問題