使用NSSearchField时,辅助NSTableView会失去焦点而不会同时更新

时间:2016-02-16 17:33:29

标签: objective-c cocoa cocoa-bindings nsarraycontroller

我在cocoa app中使用核心数据绑定。我的应用程序有三个NSTableViews绑定到NSArrayControllers关系,这样如果选择第一个表,使用Core数据关系的相关数据将显示在其他两个表中。

我已将NSSearchField挂钩到第一个NSArrayController。问题是当搜索开始时,其他两个表不与第一个表保持同步。它们根本没有显示任何内容。

其他两个表仅显示用户点击第一个时的内容。 如何在搜索发生时同时更新所有三个NSTable。

1 个答案:

答案 0 :(得分:0)

所以,我有这个有效的解决方案,我想知道这是否可以进一步改进。

因为当搜索开始时,第一个NSTableView的选择会丢失,因此连接表也会丢失,尽管表格会正确更新,显示过滤后的值。我正在设置self作为更改的观察者是NSArrayController selectedObject。

-(void)awakeFromNib{
[super awakeFromNib];
[_firstArrayController addObserver:self forKeyPath:@"selectedObjects" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
}

现在我正在观察更改,如果所选对象确实发生了更改,并且如果NSSearchField是更改它的那个,那么以编程方式选择NSTableView第一行

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)
object change:(NSDictionary *)change context:(void *)context
{
    NSResponder *firstResponder = [[NSApp keyWindow] firstResponder];
if ([firstResponder isKindOfClass:[NSText class]] && [(id)firstResponder delegate] == _searchField) {
    NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:0];
    [_authorTable selectRowIndexes:indexSet byExtendingSelection:NO];
}
}

由于使用NSSearchField进行过滤时,第一个对象是最相​​关的,因此我将选择设置为第0行。