3

1 つの NSArrayController の内容を異なる XIB で定義された 2 つのウィンドウに表示する際に問題が発生しています。

私のメイン ウィンドウ (MainMenu.xib) には、NSArrayController にバインドされた NSTableView があります。

2 番目の XIB には、NSTableView を含む別のウィンドウがあります。新しい NSArrayController を作成し、テーブルをその NSArrayController の内容にバインドしました。

両方の NSArrayController は、まったく同じ NSArray にバインドされています。

最初はすべて問題ありませんが、問題は、メイン ウィンドウで NSArrayController を使用してオブジェクトを配列に追加すると、セカンダリ ウィンドウのデータ ビューが更新されないことです。これは、新しいオブジェクトの追加に NSArrayController が使用されていないため、自分自身を更新する必要があることを認識していないことが原因である可能性が最も高いです。

私がやりたいことは、両方のウィンドウで NSArrayController のまったく同じインスタンスを使用することです。このようにして、オブジェクトが配列に追加されると、両方のビューに変更が通知されます。

問題は、Interface Builder でこれを行う方法がわからないことです。NSArrayController を別の NSArrayController にバインドできません (NSArray にしかバインドできないことを示す実行時エラーが発生します)。NSArrayController を File's Owner の NSArrayController メンバーに接続しても、使用したい NSArrayController が消去されるだけなので、どちらも役に立ちません。

コードでバインディングを自分でセットアップすることもできると思いますが、可能であれば Interface Builder を使用する方がよいようです。Interface Builderでこれを行う方法はありますか、またはこれをすべて一緒に設定するより良い方法はありますか?

更新: Chuck の回答とコメントに応えて、次のことを試しました。 : 認識されないセレクターがインスタンスに送信されました") - テーブルの各列を、arrayController.arrangedObjects.propertyName のモデル キー パスを使用してファイルの所有者にバインドします。

これでも、テーブルの内容が更新されることはありませんでした。これは、NSArrayController 自体ではなく、NSArrayController の ArrangeObjects にバインドしているためだと思います。しかし、NSArrayController に直接バインドすると、エラーが発生します。

通常、「Bind to」ComboBox から NSArrayController を選択し、arrangedObjects をコントローラー キーとして使用し、プロパティ自体をモデル キー パスとして使用します。この場合、それと同等のことを行う方法がわかりません-できれば。

上記のプロセスで何か間違ったことをしましたか?

4

4 に答える 4

1

私が思いついた最善のオプションは、NSArrayController管理している配列が変更されたことを2番目に呼び出すことで通知するrearrangeObjects:ことです。それは不格好に思えますが、機能します。

于 2009-01-27T18:48:47.220 に答える
1

それらをIBでプロキシオブジェクトとして設定してから、実際のコードを、おそらくアプリデリゲートでインスタンス化するのはどうでしょうか。

于 2009-01-27T18:51:21.757 に答える
1

アレイが追加されたときに、KVO を介して両方の NSArrayControllers を更新することができます。秘訣は、KVO に準拠した方法で配列を観察して追加する必要があることです。

配列を所有するオブジェクトが必要です。それを「モデル」と呼びましょう。配列はオブジェクトのキーである必要があります。キーを「contentArray」と呼びましょう。次に、追加/削除する場合は、最初に「model」で mutableArrayForKey を呼び出して「contentArray」を取得する必要があります。次に、配列への追加/削除が機能するはずです。次に例を示します。

Controller1 は self.model.contentArray にバインドされています

Controller2 は self.model.contentArray にバインドされています

//this method is on the "model" object
-(void)addContent(id content)
{
    NSMutableArray* contentArr = [self mutableArrayForKey:@"contentArray"];
    [contentArr addObject:content]; //this will trigger KVO notifications
}

または、次のように手動で KVO 通知を行うこともできます。

-(void)addContent(id content)
{
    [self willChangeValueForKey:@"contentArray"];
    [m_contentArray addObject:content];
    [self didChangeValueForKey:@"contentArray"];
}
于 2009-06-30T22:22:32.977 に答える
0

2 つのアレイ コントローラーを使用して、別のビューを更新するときに 1 つのビューが更新されない理由はありません。そうでない場合は、KVO 通知がどこかで失われているようです。add:ほとんどの場合、適切な変更通知を送信せずに (おそらくNSArrayController サブクラスのメソッドで) 配列を直接編集しています。

于 2009-01-19T04:14:21.463 に答える