Array Controller添加后NSTableView内容如何排序?

How is NSTableView Content Sorted After Array Controller Add?

在数组控制器 class 中添加托管对象后,绑定 table 查看 'places' 将其按正确的日期排序顺序排列。

但是,由于 table 视图正在构建它的行,新对象已使用以下方法放置在数组控制器的内容数组的底部:

编辑: 解决方法:不要使用阵列控制器的content。问题出在:

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    ....
    //  originally
    NSManagedObject *ci = [[self.arrayController content] objectAtIndex:row];
    // should be: (note arrangedObjects replacing content)
    NSManagedObject *ci = [self.arrayController.arrangedObjects objectAtIndex:row];
    ....
}

下图显示了放置示例。左侧 -tableView: viewForTableColumn: row: 内的控制台输出(来自上面的原始代码)和右侧 table 视图中的排序。 LHR 是新对象(注意日期顺序升序)。

尝试过:

  1. 添加新对象后立即保存 moc
  2. 调用 Array Controller 的 arrangeObjects 方法
  3. 正在尝试手动 setSortDescriptors
  4. 将 table 视图的选择索引绑定到数组控制器(笑)

即使添加后立即在 table 视图中选择了带有 LHR 的行,这也会弄乱 selectedRow。纠正阵列控制器顺序的唯一方法是手动对列进行排序。

阵列控制器的内容如何与table视图同步?更何况,为什么顺序不一样?

阵列控制器"arranges"其内容。它通过调用其 -arrangeObjects: 方法来完成此操作。默认实现使用数组控制器的 filterPredicate 过滤内容,然后使用其 sortDescriptors 对其进行排序。子类可以覆盖该方法以不同方式排列内容。

可以使用arrangedObjects 属性访问整理的内容。 This 对应于 table 视图中的行。因此,如果您按 table 行进行索引,则应始终使用它。例如:

NSManagedObject *ci = [self.arrayController.arrangedObjects objectAtIndex:row];

数组控制器的 sortDescriptors 可以通过绑定设置(例如,如果 table 视图的 sortDescriptors 绑定绑定到数组控制器)。根据您设置 table 视图绑定的方式,这可能是自动的。对于基于 NSCell 的 table 视图,您通常绑定 table 列 value 绑定而不绑定 table 视图绑定。在这种情况下,table 视图会自动将其 contentselectionIndexessortDescriptors 绑定到与其列相同的控制器。对于基于视图的 table 视图,您通常不绑定 table 列,如果您希望绑定这些 table 视图绑定,则必须显式绑定它们。

您还可以通过编程方式设置数组控制器的 sortDescriptors

尝试在 NSArrayController 上调用 rearrangeObjects,然后在 dispatch_async 块中执行您需要的 selection。令人抓狂的是,一些绑定被推迟到下一个 runloop 轮次,所以你不能简单地添加一个对象,调用 rearrangeObjects,然后 select 同步代码中的新对象。你必须使用 GCD 来安排事情

有关更多讨论,请参阅 this question/answer。这是完全相同的问题。添加对象并尝试 select 它。

启用阵列控制器的自动重新排列内容选项对我来说很适合。