Cocoa NSTableView makeViewWithIdentifier跨NIB

Cocoa NSTableView makeViewWithIdentifier跨NIB,cocoa,interface-builder,nstableview,xib,nib,Cocoa,Interface Builder,Nstableview,Xib,Nib,我有一个与之类似的问题,通过 对于makeViewWithIdentifier:owner: “通常,标识符与Interface Builder中的外部NIB关联,表视图将自动使用提供的所有者实例化NIB。” 这似乎意味着您应该能够将NSTableCellView存储在独立的nib中,而不是包含NSTableView的nib中。然而,在我的实验中,我只能够获得包含在我调用此函数的tableview中的单元格。也就是说,如果我将单元格剪切并粘贴到一个新的.xib文件中,tableview将无法再找

我有一个与之类似的问题,通过 对于
makeViewWithIdentifier:owner:

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


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

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

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

通常,如果您有一个单独的nib用于带有插座的自定义视图,那么您也需要一个单独的视图控制器。否则,如果您的自定义视图有一个出口,并且表格显示了许多自定义视图,那么您指的是来自“self”表格视图所有者的哪个出口

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

SSCellViewController *vc = [[SSCellViewController alloc] initWithNibName:@"CellView" bundle:nil];
return vc.view;
丢失的是使用makeViewWithIdentifier:owner:自动进行的单元格重复使用。要自己实现这一点,您可能还需要管理已创建的许多视图控制器

我可能仍然遗漏了一些东西,因为在多年只做iOS工作之后,我来到了OSX开发领域。

使用
-(void)registerNib:(NSNib*)nib forIdentifier:(NSString*)identifier
来注册nib以与单元标识符一起使用


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

Hm。。。看起来像是10.8中的新方法。针对10.7的开发人员是否运气不佳?在10.7上,您应该能够在与NSTableView相同的nib中将NSTableCellView构建为顶级对象。不过要小心。通过我的测试,每次从nib创建单元时,nib都会被实例化。换句话说,如果nib中有很多其他对象,它们也会被实例化。我提出这个问题已经有一段时间了,但IIRC的困难在于从外部nib获取NSTableCellView。实例化视图控制器,但只返回其视图。谁拥有视图控制器?它不是在ARC下自动解除分配的吗?否则它不会泄漏吗?