【发布时间】: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。
我的问题是:
- 在 IB 中,文件的所有者占位符应该设置为什么?目前它设置为 TestCell,但我不认为这是正确的。
- 可以使用“TestCell”作为标识符吗?这个标识符需要在IB中设置吗?还是我需要在表格视图上调用 registerNib:forIdentifier?
- 调用 loadNibNamed 时,所有者应设置为什么?
【问题讨论】:
-
您真的要使用 xib 吗?可以在表格视图中自定义单元格视图和行视图,并将多个单元格视图添加到一列。
-
理想情况下,我希望能够使用 Interface Builder 来布局这个自定义单元格,这将是相当复杂的。如果我不能让它工作,那么我将采用编程方式创建它。
标签: objective-c macos interface-builder