我试图将 my 绑定NSArraycontroller
到一个NSMutableArray
; 该数组包含“iData”类型的对象(它是一个自定义类)。该类还包含一些NSMutableString
变量,这些变量被设置为 KVC 的键。然后我将 my 绑定NSTableColumn
到NSArrayController
并分别设置每列的关键模型路径。
当我尝试填充数组时,GUI 不显示任何内容。我忘记了什么?
我试图将 my 绑定NSArraycontroller
到一个NSMutableArray
; 该数组包含“iData”类型的对象(它是一个自定义类)。该类还包含一些NSMutableString
变量,这些变量被设置为 KVC 的键。然后我将 my 绑定NSTableColumn
到NSArrayController
并分别设置每列的关键模型路径。
当我尝试填充数组时,GUI 不显示任何内容。我忘记了什么?
所以很可能你很久以前就解决了这个问题,但万一其他人偶然发现了这个问题......
我正在通过 填充数组
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),听起来您已经正确绑定了表列。
尽管斯蒂芬的回答可能是“要走的路”,但我认为 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 “自动”控制。