调用reloadData时NSTableView的不满意约束

And*_*rew 6 cocoa nstableview osx-mountain-lion autolayout

我有一个表视图的NSTableCellView的设置基于视图NSTableView的图形通过在Xcode中对10.8.2最新版本的界面生成器.

当我在NSTableView上调用-reloadData时,它会崩溃:

Unable to simultaneously satisfy constraints:
(
    "<NSAutoresizingMaskLayoutConstraint:0x105cb8bf0 h=--& v=--& V:[NSTableRowView:0x105ca7020(0)]>",
    "<NSAutoresizingMaskLayoutConstraint:0x10596aa30 h=--& v=-&- V:[GroupTableRowView]-(2)-|   (Names: GroupTableRowView:0x100185860, '|':NSTableRowView:0x105ca7020 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x1058d9770 h=--& v=-&- V:|-(1)-[GroupTableRowView]   (Names: GroupTableRowView:0x100185860, '|':NSTableRowView:0x105ca7020 )>"
)

Will attempt to recover by breaking constraint 
<NSAutoresizingMaskLayoutConstraint:0x10596aa30 h=--& v=-&- V:[GroupTableRowView]-(2)-|   (Names: GroupTableRowView:0x100185860, '|':NSTableRowView:0x105ca7020 )>
Run Code Online (Sandbox Code Playgroud)

我无法关闭所涉及的任何视图上的自动调整大小掩码转换,因为它们的约束由NSTableView管理.很明显,约束是冲突的,因为NSTableRowView不可能具有0高度,同时仍然满足GroupTableRowView上的其他两个约束,这些约束指定了superview(行视图?)之间的强制填充.我不知道如何解决这个问题,我们将非常感谢任何见解.谢谢!

更新:我找到了解决方法.问题在于,由于某种原因{0, 0},在表视图上调用-reloadData时,NSTableRowView 的帧大小被发送.我-setFrameSize:在NSTableRowView子类中重写,只在大小不是时才将消息传递给响应者链{0,0}.

- (void)setFrameSize:(NSSize)newSize
{
    if (!NSEqualSizes(newSize, NSZeroSize))
        [super setFrameSize:newSize];
}
Run Code Online (Sandbox Code Playgroud)

要使用子类,请实现NSTableViewDelegate的-tableView:rowViewForRow:方法以返回自定义子类的实例.

- (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row
{
    id rowView = [[GroupTableRowView alloc] init];
    // configure any custom properties
    return rowView;
}
Run Code Online (Sandbox Code Playgroud)

如果表视图完全在IB中设计,您只需将新的NSView拖到表视图中,并将其自定义类设置为NSTableRowView子类,并将其用户界面项标识符更改为 NSTableViewRowViewKey

pax*_*xos 1

我有同样的问题,它总是让我发疯。

我已经使用您的代码解决了这个问题,但是子类化NSTableRowView而不是NSTableCellView. 要自动让表使用您的自定义行视图,请将自定义添加NSView到表中。将其类设置为自定义行视图,重要的是,将其标识符设置为NSTableViewRowViewKey

有了这个特殊的标识符,表就会自动将其用作行视图。