2

NSTabViewメイン ウィンドウに複数NSTabViewItemsの があり、各項目に異なる があるアプリケーションを開発したいと思いますNSTableView

各タブのテーブルビュー コントローラーから他のタブにアクセスできるようにするには、クラス アーキテクチャをどのように編成しますか? それを行う最良の方法は何ですか?

デリゲートなどを使用してコントローラー間でデータを渡すことについて多くのことを読みましたが、この問題に対処するための別のより明確な方法が必要だと思います。

次のシナリオ例があります。

TabOneController.h

@interface TabOneController : NSControl {
    NSMutableArray *listOne;
        ...
}

TabTwoController.h

@interface TabTwoController : NSControl {
    NSMutableArray *listTwo;
        ...
}

これら 2 つのコントローラーは、そのリストをNSTableView使用して dataSource メソッドとデリゲート メソッドを実装します。NSMutableArray両方のコントローラーが相互にアクセスできる適切なシナリオが必要です (クラスメソッド、ビューコントローラー、すべてを管理する別のコントローラー、またはここに適したものなら何でも)。そのための最善の方法は何だと思いますか。

前もって感謝します

4

3 に答える 3

2

コントローラー間でデータを共有したい場合は、すべてのコントローラーにデータ オブジェクトの同じインスタンスを渡すことをお勧めします。共有するデータがさらにある場合、またはデータに追加機能が追加されている場合は、モデル クラスでラップし、コントローラーが同じモデルへのポインターを共有できるようにします。

コントローラーが相互に呼び出しを行う場合、さまざまな意味を持つ多くの可能性があり、決定的な答えはありません。すべては状況によって異なります。重要な質問は、なぜすべてのタブ コントローラーが他のタブ コントローラーにアクセスしたいのかということです。通常、コントローラーは分離しておく必要があります。これは疎結合と呼ばれ、設計に非常に適しています。

コントローラーが相互に呼び出す必要がある場合は、設計を再考してみてください。代わりに、動作の一部をモデルに移動する必要がありますか? たとえば、別のコントローラーを呼び出してリストからアイテムを削除する代わりに、削除コードをモデルに移動できます。また、関心のある他のコントローラーは、モデルを観察することでモデルの変更について知ることができます。

何をするにしても、シングルトンを使用しないでください:)シングルトンを(誤)使用せずにプロジェクトを配線する方法を示すサンプルコードをGitHubに置きました。

于 2012-05-26T12:18:16.737 に答える
1

最初のオプション: 他のコントローラーを指す各コントローラーのインスタンス変数を宣言しますか? たとえば、and でプロパティを作成したとしanotherControllerます。CustomController1

CustomController1 *controller1 = [[CustomController1 alloc] init];
CustomController2 *controller2 = [[CustomController2 alloc] init];
controller1.anotherController = controller2;

このようにcontroller1して、 にアクセスできますcontroller2。そして、他のコントローラーに対して同様のことを行うだけです。そこにいくつかの継承を適用​​することさえできます。

2 番目のオプション: 特定のコントローラーから:

CustomController *customController =
(CustomController *)[self.tabBarController.viewControllers objectAtIndex:x]

CustomController がアクセスするコントローラーのクラスであり、x がタブ バー コントローラーによって維持される配列内の場所であると仮定します。

于 2012-05-14T13:57:26.137 に答える
0

データを格納し、すべてのデータ操作を処理するシングルトンクラスを作成します...最も簡単な方法として、NSUserDefaultsにデータを格納できます。

いくつかの共有変数のみを使用する場合は、AppDelegateを使用します。

于 2012-05-26T11:55:57.667 に答える