【问题标题】:NSTableView makeViewWithIdentifier across nibsNSTableView makeViewWithIdentifier 跨笔尖
【发布时间】:2012-06-08 21:38:45
【问题描述】:

我有一个与Cocoa - View-Based NSTableView, using one cell in multiple tables 类似的问题,被放大了 Apple's own docsmakeViewWithIdentifier:owner:

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

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

【问题讨论】:

    标签: cocoa interface-builder nstableview xib nib


    【解决方案1】:

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

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

    【讨论】:

    • Hm... 看起来像是 10.8 中的新方法。面向 10.7 的开发人员是否运气不佳?
    • 在 10.7 上,您应该能够将 NSTableCellView 构建为与 NSTableView 相同的 nib 中的顶级对象。不过要小心。通过我的测试,似乎每次从它创建一个单元格时,nib 都会被实例化。换句话说,如果您的 nib 中有很多其他对象,它们也会被实例化。
    • 我提出这个问题已经有一段时间了,但 IIRC 的困难在于从外部 nib 获取 NSTableCellView。
    【解决方案2】:

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

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

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

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

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

    您失去的是使用 makeViewWithIdentifier:owner: 自动发生的单元格重用。要自己实现它,您可能还必须管理您创建的许多视图控制器。

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

    【讨论】:

    • 你实例化了一个视图控制器,但只返回它的视图。谁拥有视图控制器?它不会在 ARC 下自动释放吗?否则不会泄漏吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多