在xib中嵌套基于NSTableViews的视图

时间:2013-12-04 08:46:03

标签: objective-c macos cocoa nstableview

我正在尝试在我的xib中将一个NSTableView嵌套在另一个基于视图的tableview中。当我这样做时,我得到以下构建错误(当尝试编译xib时):

An instance of NSTableColumn with object ID jRp-dg-jOe did not archive its child (NSTableCellView) with an object of ID y8a-qz-ChK

有人看过这个,或者知道如何修复它?

我假设我可以为NSTableCellView创建另一个xib,并使用

将其连接到父NSTableView

NSNib *cellNib = [[NSNib alloc] initWithNibNamed:@"MyCellContainingAnNSTableView" bundle:nil]; [parentTable registerNib:cellNib forIdentifier:@"SomeIdentifier"];

但这有点烦人......

1 个答案:

答案 0 :(得分:7)

好的,似乎没有人有任何解决方案......

经过很长一段时间的研究,似乎Interface Builder无法归档嵌套的NSTableViews。我的解决方案是创建一个包含.xib的新NSTableCellView,并引用原始NSTableView中的.xib。这是如何做到的:

  • 在单独的SchemeCell.xib中创建新的NSTableCellView。称之为NSTableViewDelegate
  • 在代码中添加- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSNib *cellNib = [[NSNib alloc] initWithNibNamed:@"SchemeCell" bundle:nil]; [self.schemeTableView registerNib:cellNib forIdentifier:@"SchemeCell"]; }); return [self.schemeTableView makeViewWithIdentifier:@"SchemeCell" owner:self]; } ,并将其设置为主(父)tableview的委托。
  • 添加方法:

    SchemeCell

远离你!现在主要的缺点是你不能再使用Interface Builder将项目从NSTableView连接到父.xibs(因为它们现在都在单独的{{1}}中,但它是不是世界末日,因为你可以在代码中完成所有这些。