【问题标题】:NSArrayController too late for NSTableView datasource?NSArrayController 对于 NSTableView 数据源来说为时已晚?
【发布时间】:2012-01-31 21:24:30
【问题描述】:

所以, 我实例化了一个 NSWindowController,它又实例化了一个 .xib。 xib 有 NSArrayControllers,它用 NSManagedObjects 填充它们的数组。 窗口控制器有一个(可变的)数组属性,用作 .xib 中 NSTableView 的数据源。我已经实现了 NSTableViewDataSource (和委托)方法。 到目前为止,一切顺利..

窗口控制器有到 xib 中阵列控制器的出口。当我尝试填充数组时(使用字典,对象的键与表的列标识符相对应,没有问题),我很难获取数组控制器的内容。

不知何故,我没有让数组控制器及时获取它们的托管对象。当我得到数组控制器的数组 (arrangedObjects:) 来创建字典时,对于填充表格的数组属性,我什么也得不到。

我做事的顺序不正确吗?有人可以给我一个很好的解释 IB 对象(例如数组控制器)如何以及何时获取它们的数据吗?我应该将表格填充代码移动到界面构建器中的(子类)对象吗? 我尝试在窗口控制器的 init、awakeFromNib 和 windowDidLoad 方法中操作表的数组。虽然这似乎可行,但我怀疑我是否必须将表的数组对象添加到窗口的 makeKeyAndOrderFront 方法中。

【问题讨论】:

    标签: objective-c xcode nstableview nsarraycontroller


    【解决方案1】:

    没错。

    windowController 的 init 和 windowDidLoad 方法似乎是填充表格数组的错误位置。我不完全确定为什么。

    但是,当我等待 windowController 的 awakeFromNib 完成时,一切似乎都正常,如下所示:

    - (void)awakeFromNib {
        [super awakeFromNib];
        [self populateTable];
    }
    

    方法 populateTable 然后使用 IBOutlet 实例变量,这些变量在 .xib 中连接,从文件的所有者(我的窗口控制器)到保存 NSManagedObjects 的 NSArrayControllers。

    可能是 awakeFromNib 方法在 xib 中按层次排序的元素的 awakeFromNib 方法比来自 xib 结构中更高元素的 awakeFromNib 更早触发?


    我发现数组控制器的选择返回一个 NSObjectControllerProxy,而不是实际选择的托管对象时也遇到了一些麻烦。

    MyManagedObject *object = [myArrayController selection];
    

    以上代码不起作用。 以下代码行可以解决问题,尽管对我来说似乎有点复杂..

    MyManagedObject *object = [[myArrayController arrangedObjects] objectAtIndex:[myArrayController selectionIndex]];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      相关资源
      最近更新 更多