我尝试将NSArraycontroller
绑定到NSMutableArray
;该数组包含“iData”类型的对象(它是一个自定义类)。该类还包含一些NSMutableString
变量,这些变量被设置为KVC的键。然后我将NSTableColumn
绑定到NSArrayController
并分别设置每列的关键模型路径。
当我尝试填充数组时,GUI不会显示任何内容。我忘记了什么?
答案 0 :(得分:12)
所以很可能你很久以前就已经解决了这个问题,但万一其他人偶然发现了这个问题......
我通过
NSMutableArray
填充数组,但我不知道如何通过NSArrayController
填充数组,因为我的Controller.m类中没有实例。请告诉我如何解决这个问题。
你可能正在做类似
的事情[myData addObject:someObject];
但是,您的NSArrayController
无法了解NSMutableArray
实例的此更改,因为addObject
不符合KVC标准。您需要通知任何正在观察您的NSMutableArray
实例已更改的对象。至少有两种方法可以做到这一点。假设您的NSMutableArray
实例属性名为“myData”,那么您可以执行以下操作:
[self.willChangeValueForKey:@"myData"];
[myData addObject:someObject];
[self.didChangeValueForKey:@"myData"];
或
NSMutableArray *bindingsCompliantArray = [self mutableArrayValueForKey:@"myData"];
[bindingsCompliantArray addObject:someObject];
Another SO answer(链接)对mutableArrayValueForKey实际执行的操作有一个很好的解释,但我建议阅读Apple开发人员关于键值编码和键值观察的文档,以帮助理解它。
我在mainmenu.nib托盘中拖动了NSController实例。我需要在我的Controller.h文件中声明一个IBOutLet NSArrayController,然后将它与托盘中的NSArrayController实例连接吗?
您的nib文件中需要一个NSArrayController
实例,但您在界面中不需要IBOutlet来处理您在此处描述的情况。 NSArrayController
应绑定到NSMutableArray
的密钥(我的示例中为myData),听起来您已经正确绑定了表格列。
答案 1 :(得分:0)
虽然 Stephen's 的答案可能是“要走的路”,但我认为 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“自动”控制。