更新:链接到源完整源代码(download)
我正在尝试实现基于视图的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,则情况会有所不同。现在所有名称都被“Table View Cell”替换。我试图通过返回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:function中添加一个简单的NSLog语句会显示该函数甚至从未被调用过。
这个方法对我来说对标准的NSTableViews有用,而且由于NSOutlineView是NSTableView的子类,所以我期待这里有相同的行为。
非常感谢任何帮助。
谢谢!
/ Michael Knudsen
答案 0 :(得分:3)
我认为为每行返回正确视图对象的相应方法是
- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item
而不是
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item
在基于视图的表视图中返回视图,而不是objectValue。
所以应该使用:
- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item
Person *person = (Person *)item;
NSTableCellView *tableCellView = [outlineView makeViewWithIdentifier:@"PersonCell" owner:self];
tableCellView.textField.stringValue = person.name;
return tableCellView;
}