如果我更新其中一个,则 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]
.
我在 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]
.