2011-08-12 2 views

ответ

4

Если у вас есть вопрос «может ли это быть сделано в IB, точно так же, как NSArrayController с помощью инспектора привязок?», Тогда ответ «Нет». Хотя IB предлагает, что привязка возможна (можно сделать фактическое связывание), она будет генерировать исключение, поскольку NSTreeController не имеет предиката.

Я предполагаю, что это должно быть возможным путем реализации подклассов, хотя это было бы немного сложной задачей, поскольку процесс фильтрации повлияет на древовидную структуру ваших данных.

EDIT: На самом деле это может быть сделано с небольшим количеством кода. Предположив у вас есть контроллер вида, установленный в качестве делегата для вашего 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]; 
} 

выше фильтрует дерево, основанное на имя атрибут. Обратите внимание, что фильтрация древовидного изображения может иметь странные эффекты для древовидной структуры. Также обратите внимание, что при представлении пустой строки метод создает предикат по умолчанию, который фильтрует записи верхнего уровня из источника данных и восстанавливает древовидное представление.