我有一个基于视图的 NSTableView,通过 10.8.2 上最新版本的 Xcode 中的界面生成器以图形方式设置表视图的 NSTableCellView。
当我在 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 )>
我无法关闭所涉及的任何视图的自动调整大小掩码转换,因为它们的约束由 NSTableView 管理。很明显,约束是冲突的,因为 NSTableRowView 不可能有 0 高度,同时仍然满足 GroupTableRowView 上指定超级视图(行视图?)之间强制填充的其他两个约束。我不确定如何解决这个问题,任何见解将不胜感激。谢谢!
更新:我找到了一种解决方法。{0, 0}
问题是由于某种原因,当在表格视图上调用 -reloadData 时,NSTableRowView 被发送了一个帧大小。我-setFrameSize:
在 NSTableRowView 子类中覆盖,并且仅在大小不是时将消息向上传递到响应者链{0,0}
。
- (void)setFrameSize:(NSSize)newSize
{
if (!NSEqualSizes(newSize, NSZeroSize))
[super setFrameSize:newSize];
}
要使用子类,请实现 NSTableViewDelegate 的-tableView:rowViewForRow:方法以返回自定义子类的实例。
- (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row
{
id rowView = [[GroupTableRowView alloc] init];
// configure any custom properties
return rowView;
}
如果表格视图完全在 IB 中设计,您可以简单地将一个新的 NSView 拖到您的表格视图中,并将其自定义类设置为您的 NSTableRowView 子类,并将其用户界面项标识符更改为NSTableViewRowViewKey