2

我试图将 my 绑定NSArraycontroller到一个NSMutableArray; 该数组包含“iData”类型的对象(它是一个自定义类)。该类还包含一些NSMutableString变量,这些变量被设置为 KVC 的键。然后我将 my 绑定NSTableColumnNSArrayController并分别设置每列的关键模型路径。

当我尝试填充数组时,GUI 不显示任何内容。我忘记了什么?

4

2 回答 2

13

所以很可能你很久以前就解决了这个问题,但万一其他人偶然发现了这个问题......

我正在通过 填充数组NSMutableArray,但我不确定如何通过 填充数组NSArrayController,因为我的 Controller.m 类中没有实例。请告诉我如何解决这个问题。

您可能正在做类似的事情

[myData addObject:someObject];

但是,由于不符合 KVC ,您NSArrayController将不会了解对NSMutableArray实例的此更改。addObject您需要通知任何正在观察您的NSMutableArray实例已更改的对象。至少有两种方法可以做到这一点。假设您的NSMutableArray实例属性名为“myData”,那么您可以执行以下操作:

[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。NSArrayController应该绑定到您的键(NSMutableArray在我的示例中为 myData),听起来您已经正确绑定了表列。

于 2011-04-21T22:42:10.993 回答
0

尽管斯蒂芬的回答可能是“要走的路”,但我认为 OP 的原始问题“我如何插入/删除/管理我NSMutableArray的使用NSArrayController,应该得到一个更简单和更直接的答案:

NSArrayController 提供了一套完整而丰富的方法,甚至 IBActions 来满足您在托管 NSMutableArray 上想要的几乎任何东西,并具有“通过过滤器”、通过选择和“保持排序规则”处理事物的所有细节,例如插入一个新项目,以便它是根据当前的排序描述插入的。

这是这些方法的摘录(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 回答