早期警告-コードサンプルが少し長い...
アプリケーション内のどこからでもアクセスできるシングルトンNSMutableArrayがあります。複数のNIBファイルから参照できるようにしたいのですが、オブジェクトNSMutableArray
を介してUI要素にバインドしNSArrayController
ます。最初の作成は問題ではありません。NSMutableArray
NIBがロードされ、すべてが正常に表示されたときに、シングルトンを参照できます。
ただし、オブジェクトを追加または削除してを変更しても、インスタンスNSMutableArray
を更新するためにKVOが開始されるわけではありません。NSArrayController
「コントローラーの後ろで変更する」ことはココアランドの立ち入り禁止の部分と見なされていることは理解していますが、プログラムで更新しNSMutableArray
てすべての人NSArrayController
に通知する方法は他にありません(もちろん機能しない場合を除きます)。 ..)。
説明するために、以下のクラスを簡略化しました。
簡略化されたシングルトンクラスヘッダー:
@interface MyGlobals : NSObject {
NSMutableArray * globalArray;
}
@property (nonatomic, retain) NSMutableArray * globalArray;
簡略化されたシングルトンメソッド:
static MyGlobals *sharedMyGlobals = nil;
@implementation MyGlobals
@synthesize globalArray;
+(MyGlobals*)sharedDataManager {
@synchronized(self) {
if (sharedMyGlobals == nil)
[[[self alloc] init] autorelease];
}
return sharedMyGlobals;
}
-(id) init {
if(self = [super init]) {
self.globals = [[NSMutableArray alloc] init];
}
return self
}
// ---- allocWithZone, copyWithZone etc clipped from example ----
この簡略化された例では、配列内のオブジェクトのヘッダーとモデルは次のとおりです。
ヘッダーファイル:
@interface MyModel : NSObject {
NSInteger myId;
NSString * myName;
}
@property (readwrite) NSInteger myId;
@property (readwrite, copy) NSString * myName;
-(id)initWithObjectId:(NSInteger)newId objectName:(NSString *)newName;
@end
メソッドファイル:
@implementation MyModel
@synthesize myId;
@synthesize myName;
-(id)init {
[super init];
myName = @"New Object Name";
myId = 0;
return self;
}
@end
NSArrayController
ここで、適切なインスタンスを持つ2つのNIBファイルを想像してください。myArrayControllerInNibOne
それらをとと呼びますmyArrayControllerInNib2
。init
NIBコントローラーの各アレイコントローラーは、アレイのコンテンツを設定します。
// In NIB one init
[myArrayControllerInNibOne setContent: [[MyGlobals sharedMyGlobals].globalArray];
// In NIB two init
[myArrayControllerInNibTwo setContent: [[MyGlobals sharedMyGlobals].globalArray];
各NIBNSArrayController
が共有配列へのバインドを正しく初期化すると、期待どおりにUIに配列の内容が表示されます。外部イベントに基づいてコンテンツが変更されたときにグローバル配列を更新する別のバックグラウンドスレッドがあります。このバックグラウンドスレッドでオブジェクトを追加する必要がある場合は、次のようにオブジェクトを配列に追加するだけです。
[[[MyGlobals sharedMyGlobals].globalArray] addObject:theNewObject];
これは物事がバラバラになるところです。共有インスタンスにキー値がないため、グローバル配列でwillChangeValueForKey
とを呼び出すことができません(これをシングルトンクラスに追加する必要がありますか?)didChangeValueForKey
をNSNotification
起動してNIBコントローラーでキャッチし、 ;を実行することができ[myArrayControllerInNibOne rearrangeObjects]
ます。または、コンテンツnil
をアレイに設定して再割り当てしますが、どちらもハックのようです。さらに、グローバル配列に設定してNSArrayController
からnil
グローバル配列に戻すと、コンテンツがクリアされて再入力されるときにUI内で視覚的なフラッシュが発生します。
に直接追加できNSArrayController
、配列が更新されることはわかっていますが、a)他のNSArrayController
インスタンスがどのように更新されるか、b)バックグラウンドスレッドクラスをNIBインスタンスに明示的に結び付けたくない(または私がしなければならない必要があります)。
正しいアプローチは、バックグラウンドスレッドでKVO通知を何らかのaddObject
方法で起動するか、グローバル配列に格納されているオブジェクトに何かを追加することだと思います。しかし、私は途方に暮れています。
注意点として、私はCoreDataを使用していません。
どんな助けや援助も大歓迎です。