我有一个以编程方式创建的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。
我的问题是:
答案 0 :(得分:1)
通过执行以下操作,我可以使它起作用:
在tableView:viewForTableColumn:row调用中:[tableView makeViewWithIdentifier:@"Xib Name" owner:self]
如果返回nil,则调用:[[NSBundle mainBundle] loadNibNamed:@"Xib Name" owner:self topLevelObjects:&nibObjects]
,其中nibObjects为nil NSArray *。
如果loadNibNamed返回YES,则您在委托中创建的插座现在应指向新加载的视图。确保将视图标识符设置为@“ Xib Name”,以便可以使用缓存的视图。