Cocoa 偷懒抓人&;维护已排序的NSArrayController

Cocoa 偷懒抓人&;维护已排序的NSArrayController,cocoa,core-data,nsarraycontroller,Cocoa,Core Data,Nsarraycontroller,我有一个样本项目在 设置非常简单。在我的CoreData模型中,我有两个实体: 具有名称属性和与项目实体的多对多关系(项目)的工具架 具有name属性的项与工具架实体(其“父项”)有关系 然后我有两个NSArray控制器: 具有“实体名称”模式的搁板阵列控制器,实体名称为“搁板”。它准备内容并使用延迟抓取 模式为“实体名称”的项数组控制器,实体名称为“项”。它不准备内容,也不使用延迟抓取。它的内容集绑定到Shelf数组控制器的选择和“items”属性 在窗口中,我有两个NStableView和

我有一个样本项目在

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

  • 具有名称属性和与项目实体的多对多关系(项目)的工具架
  • 具有name属性的项与工具架实体(其“父项”)有关系
  • 然后我有两个NSArray控制器:

    具有“实体名称”模式的搁板阵列控制器,实体名称为“搁板”。它准备内容并使用延迟抓取

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

    在窗口中,我有两个NStableView和两个+按钮,每个按钮都与一个阵列控制器相关联

    我所做的是:

  • 按顶部+按钮并将新的工具架条目命名为“a”
  • 再次按下顶部+按钮并将工具架条目命名为“b”
  • 按顶部列标题以升序排列工具架条目
  • 确保选择了“b”条目
  • 按下底部+按钮,并将项目条目重命名为“任何”
  • 然后,我看到上面(Shelf)表中的行改变了顺序,因此“b”条目首先列出

    如果我按下信息按钮,它将执行以下操作:

  • NSLog存储架阵列控制器的排序描述符
  • 打印工具架数组控制器的arrangedObjects数组中的条目名称
  • 调用托架阵列控制器上的对象
  • 打印出Shelf array Controller的arrangedObjects数组中的条目名称
  • 在完成所有这些之后,正如预期的那样,我在Shelf Array Controller上看到了一个单独的排序描述符:名称、升序、比较:

    以及arrangedObjects的以下输出:

    2013-05-19 16:08:56.023偷懒

    2013-05-19 16:08:56.024偷懒

    2013-05-19 16:08:56.024偷懒

    2013-05-19 16:08:56.024偷懒

    出于某种原因,它不再对Shelf Array Controller中的项目进行排序

    如果我关闭Shelf Array控制器的延迟抓取,那么一切似乎都正常工作


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

    我找到了在为NSArrayController(在IB中)启用延迟抓取后强制排序的唯一方法was要在awakeFromNib中发送延迟设置为0的performSelector:withObject:afterDelay:

    • (无效)awakeFromNib{ [自执行选择器:@selector(sort)with object:self afterDelay:0.0]; }

    • (无效)排序{

      NSSortDescriptor*排序=[NSSortDescriptor SortDescriptor WithKey:@“” 上升:是]

      [self.AC_控制器设置端口描述符:[NSArray arrayWithObject:sorting]; }

    这些方法包含在我的主窗口控制器中,其中NSArrayController位于相关的nib文件中

    • 似乎在加载包含NSArrayController的nib时,nib加载机制会根据IB设置调用延迟抓取,但这会覆盖您可能试图以编程方式或通过NSTableView中的IB设置的任何排序-通过等待下一个运行循环,排序将“接受”OK
    当然,此代码假定您有一个连接到NSArrayController的IBOutlet