私はCocoaでCoreDataを使用しています(ドキュメントベースではありません)。私の問題は、異なるNIBから同じNSArrayControllerにアクセスしたいということです。ただし、すべてのNIBには、このNSArrayControllerの独自のインスタンスがあります。
私の質問は、sharedObjects(NSUserDefaultsControllerなど)をどのように生成できるかということです。それは私に大いに役立つでしょう。回答ありがとうございます。=)
通常、複数の nib 間で NSArrayController を共有することは望ましくありません。同じ基本モデルにすべてバインドされている複数の NSArrayController (NIB ごとに 1 つ) を用意することをお勧めします。このモデル (NSArray など) をアプリケーション グローバルにしたい場合は、NSApplication のデリゲートを介して公開できます (たとえば、MainMenu.nib でカスタム MyAppDelegate クラスをインスタンス化し、NSApplication のdelegate
アウトレットを MyAppDelegate クラスのインスタンスに接続します)。他の NIB では、NSArrayController のcontentArray
バインディングをバインドできますShared Application.delegate.myArray
(MyAppDelegate が、KVC 準拠のメソッドを介して、 という NSArray バインディングを公開すると仮定しますmyArray
)。基本的に IB と MainMenu.nib を使用して、MyAppDelegate のシングルトン インスタンスを作成しています。
テスト中にモックやスタブ化できないシングルトンがオブジェクト グラフに存在するため、このアプローチではアプリケーションの単体テストが困難になることに注意してください。セカンダリ (MainMenu.nib ではない) NIB ごとに NSWindowController または NSViewController を作成し、それらの nib の NSArrayControllers を にバインドする方がはるかに優れていますFile Owner.myArray
。次に、セカンダリ NIB をロードする前に、NSWindowController または NSViewController をインスタンス化し、配列 (または配列 KVC 準拠オブジェクト) を渡すことができます。このようにして、ペン先の機能を分離してテストできます (配列のモックまたはスタブを使用)。
NSArrayControllerを再利用することが最善の選択かどうかはわかりませんが(プロジェクトについて詳しく知る必要がありますが、そのようなことをするような状況に遭遇したことはありません)、次のようなクラスメソッド内の静的変数:
+ (id)sharedObject;
{
static id object = nil;
if ( object == nil )
{
object = [[self alloc] init];
}
return object;
}
そのクラスの追加のオブジェクトを割り当てることができるため、これは真のシングルトンではないことに注意してください。本当に厳しくしたい場合は、このガイドを使用できます。
Matt Gallagherは、シングルトンや、ブログに「グローバル」データを掲載するその他の方法についての優れた投稿を掲載しています。Appleのドキュメントよりも少し明確で、ヘッダーファイルへのリンクがあり、ほとんどすべてのCocoaクラスからシングルトンを簡単に作成できます。
私は実際にいくつかのプロジェクトで彼のヘッダーファイルを使用していますが、それはうまく機能します。