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

时间:2016-02-01 05:56:59

标签: objective-c cocoa core-data nstableview

我在cocoa中使用Core数据。由于我无法发布图片,我会尽力解释这个问题 我的对象模型是: 书籍:highlightInBooks>>高亮

对象由BookArrayController和HighlightArrayController管理。 BookNSTableView数据源是BookArrayController,HighlightNSTableView数据源是HighlightArrayController。

我为高亮表创建了一个NSMenu,使用突出显示属性:markHighlightToTrash 附加到NSMenue项目的操作:

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

在高亮子类中:

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

以上代码的作用是,当用户在精选表格中删除书籍的所有重点时,也会删除书籍表格中的书籍。

我在侧边栏中设置了两个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];
}

因此,如果单击AllBooks,表格将仅显示未标记为垃圾的书籍。当点击“垃圾箱”按钮时,表格将显示突出显示为垃圾箱的书籍。

问题虽然上面的代码有效,但问题是当我在高亮表中标记Book X的所有高光时,Book X仍然在BookTable中可见。 虽然当我单击“废纸篓”按钮并单击“退出AllBook”按钮时,Book X会隐藏(按预期)。

那么为什么Book表只在循环显示这两个按钮后自动更新。

1 个答案:

答案 0 :(得分:1)

数组控制器不会(并且不能)观察过滤谓词中使用的属性。如果您想在更改突出显示后重新应用过滤器,则可以使用short

执行此操作