Xib中基于视图的NSTableView

时间:2019-02-11 18:26:13

标签: objective-c macos interface-builder

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

现在,我需要能够完全自定义单元格,因此我试图从xib加载NSView并从表委托的viewForTableColumn方法返回它。我没有在iOS之外使用过很多IB,而且我对如何设置各种出口和类类型不是很熟悉,尤其是当大多数UI在IB之外创建时。我在这里和其他站点上已经阅读了很多文章,但是大多数示例要么在IB中创建所有UI,要么不创建任何UI。

当前,我具有TestCell.xib,它是通过从“新建文件”对话框中选择“视图”来创建的。我还创建了一个名为TestCell的Objective-C类。在IB中,我已将视图的类设置为TestCell,并已将标签控件的出口和按钮拖动到TestCell类。

在表的委托类中,我有以下内容:

- (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;
}

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

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

我认为那是因为我在加载xib时将所有者设置为self。

我的问题是:

  1. 在IB中,文件所有者的占位符应设置为什么?当前将其设置为TestCell,但我认为这是不正确的。
  2. 可以使用“ TestCell”作为标识符吗?是否需要在IB中设置此标识符?还是我需要在表视图上调用registerNib:forIdentifier?
  3. 调用loadNibNamed时,所有者应设置为什么?

1 个答案:

答案 0 :(得分:1)

通过执行以下操作,我可以使它起作用:

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

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

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