2012-05-13 14 views
2

メインウィンドウがNSTabViewに複数のNSTabViewItemsを持つアプリケーションを開発したいと考えており、各アイテムに異なるNSTableViewを持つアプリケーションを開発したいと考えています。コントローラ間でデータを管理するための最善のオブジェクトアーキテクチャ

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

私はpassing data between controllers using delegatesなどについて多くのことを読んだことがありますが、この問題に対処するための別の明確な方法があるはずです。

有する次のシナリオ例:

TabOneController.h

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

TabTwoController.h

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

これらの2つのコントローラがそのを使用してNSTableViewデータソースとデリゲートメソッドを実装します0リスト私は、両方のコントローラが互いにアクセスできる(クラスメソッド、View Controller、すべてを管理している別のコントローラ、または良いアイデアがここに収まる)適切なシナリオが欲しいです。それがあなたのために最善の方法だと思いますか?事前に

おかげ

答えて

2

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

コントローラがお互いを呼び出そうとする場合は、さまざまな意味でさまざまな可能性がありますが、決定的な答えはありません。状況は状況によって異なります。重要な質問は:なぜすべてのタブコントローラは他のタブコントローラにアクセスしたいのですか?一般に、コントローラは隔離しておいてください。これはゆるいカップリングと呼ばれ、あなたの設計には非常に優れています。

コントローラーが互いに呼び出す必要がある場合は、デザインを再考してみてください。たぶん、いくつかの振る舞いはモデルに行くべきでしょうか?たとえば、リストから項目を削除する別のコントローラを呼び出す代わりに、削除コードをモデルに移すことができます。他の関心のあるコントローラは、モデルを観察することによってモデルの変更について知ることができます。

あなたが何をしても、just don’t use singletons :)シングルトンを使用せずに(誤って)プロジェクトを配線する方法を示すsample code on GitHubをいくつか入れました。

1

最初のオプション:他のコントローラを指して各コントローラのインスタンス変数を宣言し ?たとえば、あなたがCustomController1で財産anotherControllerを作成したと言う:

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

この方法で、controller1controller2にアクセスする必要があります。そして、他のコントローラーにも同様のことをしてください。そこにいくつかの継承を適用​​することもできます。

番目のオプション:特定のコントローラから を行います

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

はCustomControllerは、アクセスするコントローラのクラスであり、そしてそれは、タブによって維持されたアレイに配置されている場所xがあると仮定すると、バーコントローラ。

0

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

共有変数をいくつか使って作業する場合は、AppDelegateを使用します。

関連する問題