使用NSSearchField过滤NSTreeController?

时间:2011-08-12 15:33:11

标签: nspredicate nstreecontroller nssearchfield

此问题似乎在之前被问过,但从未得到过回答。那么是否可以使用NSSearchField过滤NSTreeController?如果是,那么如何?

谢谢!

1 个答案:

答案 0 :(得分:4)

如果您的问题是“可以在IB中完成,就像使用绑定检查器的NSArrayController一样吗?”,那么答案是“否”。尽管IB建议绑定是可能的(可以进行实际绑定)但它会生成异常,因为NSTreeController没有谓词。

我认为应该可以通过实现子类来实现,尽管这会有一点挑战,因为过滤过程会对数据的树结构产生影响。

编辑:实际上可以用一些代码来完成。假设您已将视图控制器设置为NSSearchField的委托,则为您的委托实现以下方法:

- (void)controlTextDidEndEditing: (NSNotification *)aNotification {
    NSPredicate *aPredicate = nil;
    if ([[[self mySearchField] stringValue] isEqualToString:@""]) {
        aPredicate = [NSPredicate predicateWithFormat: @"parent == nil"];
    } else {
        aPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", [[self mySearchField] stringValue]];
    }
    [[self myTreeController] setFetchPredicate: aPredicate];
    [[self myOutlineView] reloadData];
}

以上根据name属性过滤树。请注意,过滤树视图可能会对树结构产生奇怪的影响。另请注意,当显示空字符串时,该方法将创建默认谓词,该谓词将从数据源中过滤顶级条目并恢复树视图。