在数组控制器类中添加托管对象后,绑定表视图将其“放置”到正确的日期排序顺序。
但是,当表视图构建它的行时,新对象使用以下命令放置在数组控制器的内容数组的底部:
编辑:解决方案:请勿使用阵列控制器的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是新对象(通知日期顺序升序)。
尝试:
setSortDescriptors
即使在添加后立即在表格视图中选择了带有LHR的行,这也会弄乱selectedRow
。更正阵列控制器顺序的唯一方法是手动对列进行排序。
阵列控制器的内容如何与表视图同步?更重要的是,为什么它们可能不在同一个顺序?
答案 0 :(得分:0)
阵列控制器"安排"它的内容。它通过调用其-arrangeObjects:
方法来实现此目的。默认实现使用阵列控制器filterPredicate
过滤内容,然后使用其sortDescriptors
对其进行排序。子类可以覆盖该方法以不同方式排列内容。
可以使用arrangedObjects
属性访问已排列的内容。 此 与表格视图中的行对应。因此,如果您按表格行进行索引,则应始终使用此选项。例如:
NSManagedObject *ci = [self.arrayController.arrangedObjects objectAtIndex:row];
可以通过绑定设置阵列控制器sortDescriptors
(例如,如果表视图的sortDescriptors
绑定绑定到阵列控制器)。根据您设置表视图绑定的方式,这可能是自动的。对于基于NSCell
的表视图,通常绑定表列value
绑定并且不绑定表视图绑定。在这种情况下,表视图会自动将其content
,selectionIndexes
和sortDescriptors
绑定绑定到与其列相同的控制器。对于基于视图的表视图,您通常不会绑定表列,并且如果要绑定它们,则必须显式绑定这些表视图绑定。
您还可以通过编程方式设置阵列控制器sortDescriptors
。
答案 1 :(得分:0)
尝试在NSArrayController上调用rearrangeObjects
,然后在dispatch_async
块中进行后续选择。令人抓狂,但有些绑定被推迟到下一个runloop转弯,所以你不能简单地添加一个对象,调用rearrangeObjects,并在同步代码中选择新对象。你必须使用GCD来安排事情
有关更多讨论,请参阅this question/answer。这是确切的相同的问题。添加对象并尝试选择它。
答案 2 :(得分:0)