2

私をにバインドしようとしNSArraycontrollerましたNSMutableArray; 配列は「iData」型のオブジェクトを保持します (これはカスタム クラスです)。このクラスにはさらにNSMutableString、KVC のキーとして設定されるいくつかの変数が含まれています。NSTableColumn次に、 myをにバインドし、NSArrayControllerすべての列のキー モデル パスをそれぞれ設定します。

アレイにデータを入力しようとすると、GUI に何も表示されません。私は何を忘れましたか?

4

2 に答える 2

13

したがって、これはずっと前に解決した可能性がありますが、他の誰かがこの質問に出くわした場合に備えて...

を介して配列にデータを入力していますが、Controller.m クラスにインスタンスがないため、 をNSMutableArray介して配列にデータを入力する方法がわかりません。NSArrayControllerこの問題を解決する方法を教えてください。

あなたが何かをしていた可能性があります

[myData addObject:someObject];

ただし、KVC に準拠していないため、インスタンスNSArrayControllerに対するこの変更は認識されません。インスタンスが変更されたことを監視しているすべてのオブジェクトに通知する必要があります。これを行うには、少なくとも 2 つの方法があります。インスタンス プロパティの名前が「myData」であると仮定すると、次のようなことができます。NSMutableArrayaddObjectNSMutableArrayNSMutableArray

[self.willChangeValueForKey:@"myData"];
[myData addObject:someObject];
[self.didChangeValueForKey:@"myData"];

また

NSMutableArray *bindingsCompliantArray = [self mutableArrayValueForKey:@"myData"];
[bindingsCompliantArray addObject:someObject];

別の SO 回答(リンク) には、 mutableArrayValueForKey が実際に何を行うかについての良い説明がありますが、それを理解するために、キー値コーディングとキー値観察に関する Apple 開発者ドキュメントを読むことをお勧めします。

NSController インスタンスを mainmenu.nib トレイにドラッグしました。Controller.h ファイルで IBOutLet NSArrayController を宣言し、それをトレイの NSArrayController インスタンスに接続する必要がありますか?

nib ファイルにインスタンスが必要ですNSArrayControllerが、ここで説明した状況ではインターフェイスに IBOutlet は必要ありません。(私の例では myData )NSArrayControllerのキーにバインドする必要があり、テーブルの列が既に正しくバインドされているようです。NSMutableArray

于 2011-04-21T22:42:10.993 に答える
0

スティーブンの答えはおそらく「行くべき道」ですが、OPの元の質問「を使用して挿入/削除/管理するにはどうすればよいですか?」はNSMutableArrayNSArrayControllerより単純で直接的な答えに値すると思います:

NSArrayController は、管理された NSMutableArray で必要なほとんどすべてを満たすためのメソッドの完全で豊富なセットと IBActions を提供します。これには、「フィルターを介して」、選択を介して、および「並べ替えルールを維持する」など、新しいアイテムを挿入するなど、物事を処理するすべての優れた点があります。現在のソート記述に従って挿入されること。

これらのメソッドからの抜粋を次に示します (NSArrayController.h完全なセットが公開されています)。「コンテンツ」は NSMutableArray であり、「arrangedObjects」はコンテンツにフィルタリングと並べ替えを適用する NSArrayController によって提供される配列であることに注意してください。 NSTableView での表示。

- (BOOL)addSelectedObjects:(NSArray *)objects;
- (BOOL)removeSelectedObjects:(NSArray *)objects;

- (IBAction)add:(nullable id)sender;    // overridden to add a new object to the content objects and to the arranged objects
- (IBAction)remove:(nullable id)sender;    // overridden to remove the selected objects
- (IBAction)insert:(nullable id)sender;

- (void)addObject:(id)object;    // overridden to add to the content objects and to the arranged objects if all filters currently applied are matched
- (void)addObjects:(NSArray *)objects;
- (void)insertObject:(id)object atArrangedObjectIndex:(NSUInteger)index;    // inserts into the content objects and the arranged objects (as specified by index in the arranged objects) - will raise an exception if the object does not match all filters currently applied
- (void)insertObjects:(NSArray *)objects atArrangedObjectIndexes:(NSIndexSet *)indexes;
- (void)removeObjectAtArrangedObjectIndex:(NSUInteger)index;    // removes from the content objects and the arranged objects (as specified by index in the arranged objects)
- (void)removeObjectsAtArrangedObjectIndexes:(NSIndexSet *)indexes;
- (void)removeObject:(id)object;    // removes from the content objects and the arranged objects (if currently contained)
- (void)removeObjects:(NSArray *)objects;

もちろん、これはすべて、コンテンツをプログラムで直接制御するためのものであり、Cocoa-Bindings を介して「自動的に」ではありません。

于 2021-07-05T05:47:53.233 に答える