所以, 我实例化一个NSWindowController,它反过来实例化一个.xib。 xib具有NSArrayControllers,它使用NSManagedObjects填充其数组。 窗口控制器具有(可变)数组属性,该属性用作.xib中NSTableView的数据源。我实现了NSTableViewDataSource(和委托)方法。 到目前为止,这么好..
窗口控制器具有指向xib中阵列控制器的插座。当我尝试填充数组时(使用字典,对象的键对应表的列标识符,没有问题),我很难获得数组控制器的内容。
不知何故,我没有让数组控制器及时获取其托管对象。当我得到数组控制器的数组(arrangeObjects :),创建字典时,对于填充表的数组属性,我什么也得不到。
我没有按正确的顺序做事吗?有人能指出我如何以及何时IB对象(例如阵列控制器)获取数据?我应该将表填充代码移动到接口构建器中的(子类)对象吗? 我试过在窗口控制器的init,awakeFromNib和windowDidLoad方法中操作表的数组。虽然这似乎有效,但我怀疑我必须在窗口的makeKeyAndOrderFront方法中添加表的数组对象。
答案 0 :(得分:1)
右。
似乎windowController的init和windowDidLoad方法是填充表格数组的错误位置。我不完全确定为什么。
然而,当我等待windowController的awakeFromNib完成时,一切似乎都能正常工作,如下所示:
- (void)awakeFromNib {
[super awakeFromNib];
[self populateTable];
}
populateTable方法然后使用在.xib中连接的IBOutlet实例变量,从File的所有者(我的窗口控制器)到保存NSManagedObjects的NSArrayControllers。
可能是在xib的层次结构中更深层次排序的元素的awakeFromNib方法,比xib结构中更高层的元素中的awakeFromNib更快地触发了吗?
我发现数组控制器的选择返回NSObjectControllerProxy而不是实际选择的托管对象时,我也遇到了一些麻烦。
MyManagedObject *object = [myArrayController selection];
以上代码不起作用。 以下代码行可以解决这个问题,虽然对我来说似乎有点精心。
MyManagedObject *object = [[myArrayController arrangedObjects] objectAtIndex:[myArrayController selectionIndex]];