在xib中嵌套基于NSTableViews的视图

Pat*_*ick 3 macos cocoa objective-c 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"];

但那有点烦人......

Pat*_*ick 7

好吧所以似乎没人有任何解决方案......

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

  • 单独创建一个新的NSTableCellView .xib.称之为SchemeCell.xib
  • 添加NSTableViewDelegate到您的代码,并将其设置为主(父)tableview的委托.
  • 添加方法:

    - (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];
     }
    
    Run Code Online (Sandbox Code Playgroud)

你走吧!现在主要的缺点是你不能再使用Interface Builder将项目连接SchemeCell到父项NSTableView(因为它们现在都是分开的.xibs,但它不是世界末日,因为你可以在其中完成所有这些代码当然.