我在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表只在循环显示这两个按钮后自动更新。
答案 0 :(得分:1)
数组控制器不会(并且不能)观察过滤谓词中使用的属性。如果您想在更改突出显示后重新应用过滤器,则可以使用short
。