4

我有一个示例项目

https://github.com/ericgorr/LazyFetching

设置非常简单。在我的 CoreData 模型中,我有两个实体:

  1. 具有 name 属性和与 Item 实体的一对多关系(项目)的 Shelf
  2. 具有 name 属性的项目与 Shelf 实体有关系(它是“父级”)

然后我有两个 NSArrayControllers:

模式为“实体名称”的货架阵列控制器,实体名称为“货架”。它准备内容并使用延迟获取。

模式为“实体名称”的项目数组控制器,实体名称为“项目”。它不准备内容,也不使用延迟获取。它的内容集绑定到货架阵列控制器的选择和“项目”属性。

在 Window 上,我有两个 NSTableView 和两个 + 按钮,每个按钮都与一个数组控制器相关联。

我所做的是:

  1. 按顶部的 + 按钮并将新的货架条目命名为“a”
  2. 再次按下顶部的 + 按钮并将货架条目命名为“b”
  3. 按顶部的列标题以升序对货架条目进行排序。
  4. 确保选择了“b”条目
  5. 按底部 + 按钮并将 Item 条目重命名为任何内容

然后我看到的是上部(货架)表中的行更改顺序,以便首先列出“b”条目。

如果我按下信息按钮,它会做的是:

  1. NSLog 货架阵列控制器的排序描述符
  2. 打印 Shelf Array Controller 的 mappedObjects 数组中的条目名称
  3. 在货架阵列控制器上调用重新排列对象
  4. 打印出Shelf Array Controller的arrangedObjects数组中的条目名称

在这一切之后,正如预期的那样,我在 Shelf Array 控制器上看到了一个排序描述符:名称、升序、比较:

以及排列对象的以下输出:

2013-05-19 16:08:56.023 LazyFetching[11791:303] b

2013-05-19 16:08:56.024 LazyFetching[11791:303]

2013-05-19 16:08:56.024 LazyFetching[11791:303] b

2013-05-19 16:08:56.024 LazyFetching[11791:303]

由于某种原因,它不再对货架阵列控制器中的项目进行排序。

如果我为 Shelf Array 控制器关闭 Lazy Fetching,一切似乎都正常工作。

所以,我不明白为什么我会在启用延迟获取的情况下看到这种行为。这似乎是一个错误。如果是这样,我当然可以提交可能是重复的报告。但是,我猜,有一些很好的解释和处理它的标准方法,因此项目仍然按数组控制器的排列对象数组中的排序描述符排序。

4

1 回答 1

0

我发现在为 NSArrayController(在 IB 中)打开延迟获取后强制排序的唯一方法是在 awakeFromNib 中发送 performSelector:withObject:afterDelay: 并将延迟设置为 0:

  • (void)awakeFromNib { [self performSelector:@selector(sort) withObject:self afterDelay:0.0]; }

  • (无效)排序{

    NSSortDescriptor* 排序 = [NSSortDescriptor sortDescriptorWithKey:@"" 升序:YES];

    [self.AC_Controller setSortDescriptors:[NSArray arrayWithObject:sorting]]; }

这些方法包含在我的主窗口控制器中,其中 NSArrayController 驻留在关联的 nib 文件中。

  • 似乎在加载包含 NSArrayController 的 nib 时,nib 加载机制会根据 IB 设置调用延迟获取,但这会覆盖您可能尝试以编程方式或通过 NSTableView 中的 IB 设置的任何排序 - 通过等待下一个运行循环然后排序将“接受”确定。

这段代码当然假设你有一个连接到 NSArrayController 的 IBOutlet。

于 2013-10-19T23:07:24.090 回答