我已经设置了一个NSOutlineView
with DataSource。
输入的数据NSOutlineView
基本上是一个自定义节点树,每个节点(我们称之为这个PPDocument
)具有 2 个基本属性(还有更多,但这是必不可少的部分):
- 标签(显示的内容)
- children(一组子节点)
当我的过滤器字段(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
错误)。
有任何想法吗?您是否注意到任何明显的错误?