在阵列控制器添加后如何排序NSTableView内容?

时间:2015-03-29 22:27:02

标签: cocoa sorting nstableview cocoa-bindings nsarraycontroller

在数组控制器类中添加托管对象后,绑定表视图将其“放置”到正确的日期排序顺序。

但是,当表视图构建它的行时,新对象使用以下命令放置在数组控制器的内容数组的底部:

编辑:解决方案:请勿使用阵列控制器的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:内(来自上面的原始代码),右侧是表格视图中的排序。 LHR是新对象(通知日期顺序升序)。

enter image description here

尝试:

  1. 添加newObject后立即保存moc
  2. 调用Array Controller的arrangeObjects方法
  3. 尝试手动setSortDescriptors
  4. 将表视图的选择索引绑定到数组控制器(用于grins)
  5. 即使在添加后立即在表格视图中选择了带有LHR的行,这也会弄乱selectedRow。更正阵列控制器顺序的唯一方法是手动对列进行排序。

    阵列控制器的内容如何与表视图同步?更重要的是,为什么它们可能不在同一个顺序?

3 个答案:

答案 0 :(得分:0)

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

可以使用arrangedObjects属性访问已排列的内容。 与表格视图中的行对应。因此,如果您按表格行进行索引,则应始终使用此选项。例如:

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

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

您还可以通过编程方式设置阵列控制器sortDescriptors

答案 1 :(得分:0)

尝试在NSArrayController上调用rearrangeObjects,然后在dispatch_async块中进行后续选择。令人抓狂,但有些绑定被推迟到下一个runloop转弯,所以你不能简单地添加一个对象,调用rearrangeObjects,并在同步代码中选择新对象。你必须使用GCD来安排事情

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

答案 2 :(得分:0)

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