来自 Xib 的基于视图的 NSTableView

View-based NSTableView From Xib

我有一个以编程方式创建的 NSTableView。我有几个选项可以根据列类型和数据源自定义每列中的单元格(即,很容易根据列类型和数据源中的内容设置按钮或复选框)。

现在我需要能够完全自定义单元格,因此我尝试从 xib 加载 NSView 并从 tables 委托的 viewForTableColumn 方法 return 加载它。我在 iOS 之外没有使用过 IB,而且我不太了解应该如何设置各种插座和 class 类型,尤其是当大多数 UI在 IB 之外创建。我在这里和其他网站上阅读了很多帖子,但大多数示例要么在 IB 中创建所有 UI,要么创建其中的 none。

目前我有 TestCell.xib,它是通过从“新建文件”对话框中选择“查看”创建的。我还创建了一个名为 TestCell 的 objective-c class。在 IB 中,我将视图的 class 设置为 TestCell,并将标签控件和按钮的出口拖到 TestCell class.

在 table 的委托 class 中,我有以下内容:

- (NSView*)tableView:(NSTableView*)tableView viewForTableColumn:(NSTableColumn*)tableColumn row:(NSInteger)row {
    NSView* view = [tableView makeViewWithIdentifier:customRowXibName owner:self];
    if( view == nil ) {
        NSArray* nibObjects = nil;
        if( [[NSBundle mainBundle] loadNibNamed:customRowXibName owner:self topLevelObjects:&nibObjects] ) {
            view = [nibObjects lastObject];
        }
    }

    return view;
}

但是,table 视图没有显示任何内容。加载 xib 时,视图中的两个控件也出现以下错误:

Failed to connect (button) outlet from (TableListViewDelegate) to (NSButton): missing setter or instance variable

我假设这是因为我在加载 xib 时将 owner 设置为 self。

我的问题是:

  1. 在IB中,File's Owner占位符应该设置成什么?目前它设置为 TestCell,但我认为这是不正确的。
  2. 可以使用"TestCell"作为标识符吗?这个标识符需要在IB中设置吗?或者我需要在 table 视图上调用 registerNib:forIdentifier 吗?
  3. 调用loadNibNamed时,owner应该设置成什么?

我可以通过执行以下操作来实现它:

  1. 在 IB 中,将文件所有者设置为正在加载 Xib 的 class(在本例中为 NSTableViewDelegate)。
  2. 在委托中,为您的自定义单元格创建一个出口并将其连接到 IB 中(我使用连接检查器并选择了文件所有者)。
  3. 在tableView:viewForTableColumn:row调用:[tableView makeViewWithIdentifier:@"Xib Name" owner:self]

  4. 如果 returns 为 nil,则调用:[[NSBundle mainBundle] loadNibNamed:@"Xib Name" owner:self topLevelObjects:&nibObjects] nibObjects 为 nil NSArray*.

  5. 如果 loadNibNamed returns YES,那么您在委托中创建的插座现在应该指向新加载的视图。确保将视图标识符设置为@"Xib Name",以便您可以使用缓存的视图。