【问题标题】:View-based NSTableView From Xib来自 Xib 的基于视图的 NSTableView
【发布时间】:2019-07-05 07:37:46
【问题描述】:

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

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

目前我有 TestCell.xib,它是通过从 New File 对话框中选择 View 创建的。我还创建了一个名为 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 时,所有者应设置为什么?

【问题讨论】:

  • 您真的要使用 xib 吗?可以在表格视图中自定义单元格视图和行视图,并将多个单元格视图添加到一列。
  • 理想情况下,我希望能够使用 Interface Builder 来布局这个自定义单元格,这将是相当复杂的。如果我不能让它工作,那么我将采用编程方式创建它。

标签: objective-c macos interface-builder


【解决方案1】:

我能够通过执行以下操作来使其工作:

  1. 在 IB 中,将 File's Owner 设置为加载 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",以便您可以使用缓存的视图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    相关资源
    最近更新 更多