来自 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。
我的问题是:
- 在IB中,File's Owner占位符应该设置成什么?目前它设置为 TestCell,但我认为这是不正确的。
- 可以使用"TestCell"作为标识符吗?这个标识符需要在IB中设置吗?或者我需要在 table 视图上调用 registerNib:forIdentifier 吗?
- 调用loadNibNamed时,owner应该设置成什么?
我可以通过执行以下操作来实现它:
- 在 IB 中,将文件所有者设置为正在加载 Xib 的 class(在本例中为 NSTableViewDelegate)。
- 在委托中,为您的自定义单元格创建一个出口并将其连接到 IB 中(我使用连接检查器并选择了文件所有者)。
在tableView:viewForTableColumn:row调用:[tableView makeViewWithIdentifier:@"Xib Name" owner:self]
如果 returns 为 nil,则调用:[[NSBundle mainBundle] loadNibNamed:@"Xib Name" owner:self topLevelObjects:&nibObjects]
nibObjects 为 nil NSArray*.
如果 loadNibNamed returns YES,那么您在委托中创建的插座现在应该指向新加载的视图。确保将视图标识符设置为@"Xib Name",以便您可以使用缓存的视图。
我有一个以编程方式创建的 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。
我的问题是:
- 在IB中,File's Owner占位符应该设置成什么?目前它设置为 TestCell,但我认为这是不正确的。
- 可以使用"TestCell"作为标识符吗?这个标识符需要在IB中设置吗?或者我需要在 table 视图上调用 registerNib:forIdentifier 吗?
- 调用loadNibNamed时,owner应该设置成什么?
我可以通过执行以下操作来实现它:
- 在 IB 中,将文件所有者设置为正在加载 Xib 的 class(在本例中为 NSTableViewDelegate)。
- 在委托中,为您的自定义单元格创建一个出口并将其连接到 IB 中(我使用连接检查器并选择了文件所有者)。
在tableView:viewForTableColumn:row调用:
[tableView makeViewWithIdentifier:@"Xib Name" owner:self]
如果 returns 为 nil,则调用:
[[NSBundle mainBundle] loadNibNamed:@"Xib Name" owner:self topLevelObjects:&nibObjects]
nibObjects 为 nil NSArray*.如果 loadNibNamed returns YES,那么您在委托中创建的插座现在应该指向新加载的视图。确保将视图标识符设置为@"Xib Name",以便您可以使用缓存的视图。