跨nib的NSTableView makeViewWithIdentifier

时间:2012-06-04 20:10:44

标签: cocoa interface-builder nstableview xib nib

我对Cocoa - View-Based NSTableView, using one cell in multiple tables提出了类似的问题 makeViewWithIdentifier:owner:

Apple's own docs
  

“通常,标识符与Interface Builder中的外部NIB相关联,表格视图将自动使用提供的所有者实例化NIB。”

这似乎意味着您应该能够将NSTableCellView存储在包含NSTableView的笔尖的单独笔尖中。然而,在我的实验中,我只能获得包含在tableview中的单元格,我正在调用它。即,如果我将单元格剪切并粘贴到新的.xib文件中,则tableview将无法再找到它。我做错了什么,或者这实际上是不可能的,我在某种程度上误读了Apple的文档?

2 个答案:

答案 0 :(得分:5)

使用- (void)registerNib:(NSNib *)nib forIdentifier:(NSString *)identifier注册要与单元格标识符一起使用的笔尖。

如果它不起作用,您可能在加载tableView数据后注册nib。使用[tableView reloadData]后记以确保它不是时间问题。

答案 1 :(得分:3)

我刚遇到这个问题,我认为当你使用专用的Nib来填充基于视图的表时,你不能使用 makeViewWithIdentifier:owner:

问题与文件所有者(即视图控制器)有关。 makeViewWithIdentifier:owner:似乎与“self”一起用作简单自定义视图的所有者。

通常,如果您有自定义视图的单独nib和outlet,那么您也需要一个单独的视图控制器。否则,如果您的自定义视图有一个插座,并且该表显示了许多自定义视图,那么您从“自我”表格视图所有者引用哪个插座?

所以在我的测试中,我已经将AppDelegate作为Table View的委托/数据源。我有一个 CellView.xib CellViewController.h / .m ,带有接口的插座。然后在我的 tableView:viewForTableColumn:row:委托方法中我有这个代码:

SSCellViewController *vc = [[SSCellViewController alloc] initWithNibName:@"CellView" bundle:nil];
return vc.view;

您丢失的是使用makeViewWithIdentifier:owner:自动执行的单元格重用。要自己实现这一点,您可能还需要处理管理您创建的许多视图控制器。

我可能仍然会遗漏一些东西,因为我经过多年的iOS工作后才开始进行OS X开发。