更新: 完整源代码下载链接 (下载)
我正在尝试实现一个基于视图的NSOutlineView (Sourcelist),但是我遇到了问题。为了说明问题,我创建了一个最简示例。
我有一个名为Person的简单类。每个人都有一个名字(NSString),可能还有一些孩子(NSArray)。我添加了一个NSOutlineView,将其连接到IBOutlet,将自己设置为DataSource,并实现了NSOutlineViewDataSource方法。
首先考虑基于CELL的NSOutlineView的情况:
- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item
{
// We are at the root
if (!item)
{
return [self.persons count];
}
// We are at an internal node
Person *person = (Person *)item;
return [person.children count];
}
- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item
{
// We are at the root
if (!item)
{
return self.persons[index];
}
// We are at an internal node
Person *person = (Person *)item;
return person.children[index];
}
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item
{
Person *person = (Person *)item;
if ([person.children count] > 0)
{
return YES;
}
return NO;
}
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item
{
Person *person = (Person *)item;
return person.name;
}
它的工作方式与我预期的一样:
然而,如果我将NSOutlineView更改为基于视图的VIEW BASED,则情况会有很大不同。现在所有名称都被“表格视图单元格”替换。我尝试通过返回NSTableCellView来解决问题:
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item
{
Person *person = (Person *)item;
NSTableCellView *tableCellView = [outlineView makeViewWithIdentifier:@"PersonCell" owner:self];
tableCellView.textField.stringValue = person.name;
return tableCellView;
}
不做进一步更改,这不会改变任何事情。当我将NSOutlineView中的TableCellView的标识符更改为PersonCell时,所有单元格都变为空白。事实上,在outlineView:objectValueForTableColumn:byItem:函数中添加一个简单的NSLog语句会发现该函数甚至从未被调用过。
这种方法在标准NSTableView中对我有效,而且由于NSOutlineView是NSTableView的子类,我期望在这里也有相同的行为。
非常感谢您的帮助。
谢谢!
/Michael Knudsen