我有一个NSTableView,其委托和数据源指向我的控制器。我试过实现
- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
方法,但无论我返回什么,表总是在数据中显示“Table View Cell”。我可能做错什么的想法?附上两张照片,显示我已正确设置了代理(它还显示了正确的行数)。
请注意,我刚刚尝试为所有内容返回@"Hello World"
,但我得到的结果相同。
答案 0 :(得分:55)
只需将IB中的表格视图的Content Mode
更改为Cell Based
即可。 IB将显示Text Cell
作为单元格占位符,在运行时通过tableView:objectValueForTableColumn:row:
答案 1 :(得分:10)
终于明白了。我的单元格由于某种原因似乎包含TableCellView和文本字段单元格。我删除了Table Cell View
,现在一切正常。我不知道我是如何进入那种状态的。
答案 2 :(得分:9)
更新版本的XCode:
答案 3 :(得分:6)
大多数响应都涉及将表视图组件转换为基于单元格的表视图。如果这就是你想要的那么那就没事了,你很高兴。在提出问题时,基于单元格的表格是常态,当Apple将窗口组件更改为基于视图的组件时,显然会引起很多混乱。今天,Apple的文档建议您应该使用基于视图而不是基于单元格的表。
如果在数据源中使用- tableView:objectValueForTableColumn:row:
,则会出现问题中描述的问题。您不能将此方法用于基于视图的表,它仅适用于基于单元格的表。相反,您需要使用NSTableViewDelegate
方法- tableView:viewForTableColumn:row:
。您不需要使对象符合NSTableViewDelegate
协议以使用此方法,但必须将其设置为表的委托。
回应Cœur,引用Apple On-line docs.
仍然支持基于NSCell的表 在OS X v10.6及更早版本中,每个表视图单元都必须是NSCell的子类。这种方法在设计复杂的自定义单元时造成了限制,通常需要您编写自己的NSCell子类。提供动画,例如进度视图,也非常困难。在本文档中,这些类型的表视图称为基于NSCell的表视图。 OS X v10.7及更高版本继续支持基于NSCell的表,但它们通常仅用于支持遗留代码。通常,您应该使用基于NSView的表。
答案 4 :(得分:1)
您可能会错过最重要的-numberOfRowsInTableView:
数据源方法。有关详细信息,请参阅Table View Programming Guide: (View-based table view) The Required Methods和Table View Programming Guide: (cell-based table view) Providing Data To a Table View Programmatically。
基本上,调用的第一个NSTableViewDataSource
方法是numberOfRowsInTableView:
。只有在您从该方法中返回非零数量后,才会调用后续的tableView:objectValueForTableColumn:row:
或tableView:willDisplayCell:forTableColumn:row:
方法。
答案 5 :(得分:0)
您误解了框架如何使用-tableView:objectValueForTableColumn:row:
的结果。
要执行或多或少的上述尝试,请改写代理方法-tableView:willDisplayCell:forTableColumn:row:
。以下是我自己的应用程序中的一个示例:
- (void)tableView:(NSTableView *)tableView
willDisplayCell:(id)cell
forTableColumn:(NSTableColumn *)tableColumn
row:(NSInteger)row;
{
NSString * displayName = [self.senders objectAtIndex:row];
[cell setTitle:displayName];
[cell setState:[self.selection containsObject:displayName]];
}
这是“老派”方式,使用基于单元格的表格(仍然是默认值)。