NSTableView仅显示“表视图单元格”

时间:2011-09-23 19:08:58

标签: objective-c cocoa nstableview

我有一个NSTableView,其委托和数据源指向我的控制器。我试过实现

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex

方法,但无论我返回什么,表总是在数据中显示“Table View Cell”。我可能做错什么的想法?附上两张照片,显示我已正确设置了代理(它还显示了正确的行数)。

What the table shows enter image description here

请注意,我刚刚尝试为所有内容返回@"Hello World",但我得到的结果相同。

6 个答案:

答案 0 :(得分:55)

只需将IB中的表格视图的Content Mode更改为Cell Based即可。 IB将显示Text Cell作为单元格占位符,在运行时通过tableView:objectValueForTableColumn:row:

返回的任何内容填充

答案 1 :(得分:10)

终于明白了。我的单元格由于某种原因似乎包含TableCellView和文本字段单元格。我删除了Table Cell View,现在一切正常。我不知道我是如何进入那种状态的。

enter image description here

答案 2 :(得分:9)

更新版本的XCode:

  1. 选择表格视图(确保未选择滚动视图或任何其他视图)。
  2. 在右侧,选择"属性检查器"
  3. 将内容模式更改为"基于单元格"而不是"基于视图"
  4. 保存更改并重新运行项目。

答案 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 MethodsTable 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]];
}

这是“老派”方式,使用基于单元格的表格(仍然是默认值)。