Я установил NSOutlineView
с помощью DataSource.Фильтрация содержимого NSOutlineView
Данные, подаваемые в NSOutlineView
в основном дерево пользовательского узла, с каждым узлом (назовем это PPDocument
) отличая 2 основные свойства (есть гораздо больше, но это существенная часть):
- метка (что отображается)
- детей (массив дочерних узлов)
Когда мой фильтр F ield (на самом деле NSSearchField
), я вызываю reloadData
на экране.
Итак, я решил подключить всю фильтрацию в источнике данных, как это:
- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(PPDocument*)doc {
if (doc==nil) return [[[[APP documentManager] documentTree] groups] count]; // Root
else
{
if ([[[APP fileOutlineFilter] stringValue] isEqualToString:@""]) // Unfiltered
return [doc noOfChildren];
else
return [doc noOfChildrenFiltered:[[APP fileOutlineFilter] stringValue]];
}
}
- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(PPDocument*)doc {
if (doc == nil) return [[[APP documentManager] documentTree] groups][index]; // Root
else
{
if ([[[APP fileOutlineFilter] stringValue] isEqualToString:@""]) // Unfiltered
return [doc childAtIndex:index];
else
return [doc childAtIndex:index filtered:[[APP fileOutlineFilter] stringValue]];
}
}
И 3 основных "фильтрация" функции:
- (NSArray*)filteredChildren:(NSString*)filter
{
NSMutableArray* ret = [[NSMutableArray alloc] initWithObjects: nil];
if (([self.label contains:filter]) && ([self.children count]==0)) return @[self];
for (PPDocument* d in _children)
{
NSArray* filtered = [d filteredChildren:filter];
if ([filtered count]>0)
{
PPDocument* newDoc = [d copy];
newDoc.children = [filtered mutableCopy];
[ret addObject:newDoc];
}
}
return ret;
}
- (NSInteger)noOfChildrenFiltered:(NSString*)filter
{
NSArray* filtered = [self filteredChildren:filter];
return [filtered count];
}
- (PPDocument*)childAtIndex:(NSInteger)index filtered:(NSString*)filter {
NSArray* filtered = [self filteredChildren:filter];
return (PPDocument*)(filtered[index]);
}
Однако это Безразлично Кажется, что он работает правильно (+ isGroupItem:
функция вдруг начала метать EXC_BAD_ACCESS
ошибок).
Любые идеи? Есть ли очевидная ошибка, которую вы заметили?
Я нашел свой ответ на ваш вопрос здесь https://github.com/johndpope/paperless – johndpope