NSTableView跨nib文件使用makeViewWithIdentifier方法

9
我有一个类似的问题,涉及到编程中的内容。我想知道如何使用一个单元格在多个表格中,参考了Cocoa - View-Based NSTableViewApple自己的文档中的makeViewWithIdentifier:owner:方法。
引用一段话:“通常标识符与Interface Builder中的外部NIB相关联,表视图将自动使用提供的所有者实例化NIB。”
这似乎意味着您应该能够将NSTableCellView存储在与包含NSTableView的nib文件不同的nib文件中。然而,在我的实验中,我只能获得包含在我调用此方法的tableview中的单元格。也就是说,如果我将单元格剪切并粘贴到新的.xib文件中,表视图将无法找到它。我做错了什么,还是这是不可能的,并且我在错误地阅读苹果的文档?
2个回答

6

使用- (void)registerNib:(NSNib *)nib forIdentifier:(NSString *)identifier方法,可以将一个nib文件注册到cell identifier中以供使用。

如果没有起作用,很可能是在tableView的数据已经被加载后才注册了该nib文件。此时需要在之后使用[tableView reloadData]确保不是时间问题。


1
嗯...似乎在10.8中有一个新的方法。开发者针对10.7的目标怎么办? - justin k.
1
在10.7版本中,您应该能够将NSTableCellView作为顶级对象与NSTableView一起构建在同一个nib文件中。但是要注意,通过我的测试发现,每次从nib文件创建单元格时都会实例化它。换句话说,如果您的nib文件中有很多其他对象,它们也会被实例化。 - Arlen Anderson
我提出这个问题已经有一段时间了,但是如果我没有记错,难点在于从外部nib文件中获取NSTableCellView。 - justin k.

3

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

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

通常,如果您有一个单独的nib用于自定义视图,则还需要一个单独的视图控制器。否则,如果您的自定义视图具有outlet并且表显示许多自定义视图,则从“self”表视图所有者引用哪个输出口?

因此,在我的测试中,我将AppDelegate设置为Table View的代理/数据源。我有一个CellView.xibCellViewController.h/.m,具有界面的出口。然后在我的tableView:viewForTableColumn:row:代理方法中,我有以下代码:

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

你失去的是自动发生的使用makeViewWithIdentifier:owner:重用单元格。如果要自己实现,你还需要处理管理已创建的许多视图控制器。

可能我仍然缺少一些东西,因为我在多年只做iOS工作后才开始进行OS X开发。


2
你实例化了一个视图控制器,但只返回了它的视图。谁拥有这个视图控制器?在ARC下它不会自动释放吗?否则它会泄漏吗? - Nicolas Miari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接