如果我更新其中一个,则 NSArrayControllers 的两个链接的 NSTables 不会同时更新

Two linked NSTables by NSArrayControllers are not updating simultaneously, if I update one of them

我在 cocoa 中使用核心数据。由于无法post图片,我会尽力说明问题 我的对象模型是: Book:highlightInBooks >> Highlight

对象由 BookArrayController 和 HighlightArrayController 管理。 BookNSTable视图数据源是 BookArrayController,HighlightNSTable视图数据源是 HighlightArrayController。

我为高亮 table 创建了一个 NSMenu,它使用 Highlight 属性:markHighlightToTrash 附加到 NSMenue 项目的操作:

- (IBAction)trashHighlight:(id)sender {
Highlight *highlight = [_highlightArrayController arrangedObjects][[_highlightTableView clickedRow]];
    [highlight setHighlightToTrash];
]

在高亮子类中:

-(void) setHighlightToTrash{
    self.markHighlightToTrash = @1;
}

所以上面的代码所做的是,当用户在 Highlight table 中丢弃一本书的所有 highlight 时,也会在 Book Table 中丢弃该书。

我在侧边栏中设置了两个 NSButton,即 AllBooks 和 Trash。

- (IBAction)allBookButton:(id)sender {

    NSPredicate *predicateTwo = [NSPredicate predicateWithFormat:@"SUBQUERY(highlightsInBook, $highlight, $highlight.markHighlightToTrash = NO) .@count > 0"];
    [_bookArrayController setFilterPredicate:predicateTwo];

    [_highlightArrayController setFilterPredicate:[NSPredicate predicateWithFormat:@"markHighlightToTrash = NO "]];   
}

- (IBAction)trashButton:(id)sender {

    [_highlightArrayController setFilterPredicate:[NSPredicate predicateWithFormat:@"markHighlightToTrash = YES"]];

    NSPredicate *predicateTwo = [NSPredicate predicateWithFormat:@"SUBQUERY(highlightsInBook, $highlight, $highlight.markHighlightToTrash = YES) .@count > 0"];
    [_bookArrayController setFilterPredicate:predicateTwo];
}

因此,如果单击“所有图书”,tables 将仅显示那些未标记为垃圾的图书。当点击垃圾桶按钮时,tables 将显示突出显示为垃圾桶的书籍。

问题 虽然上面的代码有效,但问题是当我在高亮 table 中标记 Book X 的所有高亮时,Book X 仍然在 BookTable。 尽管当我单击垃圾箱按钮并再次单击返回 AllBook 按钮时,Book X 确实隐藏了(如预期的那样)。

那么为什么 Book table 只在我循环使用这两个按钮后才更新自己。

数组控制器不(也不能)观察过滤器谓词中使用的属性。如果你想在更改突出显示后重新应用过滤器,你可以使用 [arrayController rearrangeObjects].