6

我有一个基于视图的 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

4

2 回答 2

1

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

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

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

于 2013-04-03T13:44:23.587 回答
1

我有一个类似的问题,但列宽而不是行高。NSTableView调用后立即在基于视图的 s的单元格上弹出无法满足的自动布局约束reloadData。在我的情况下,这是由于最小宽度设置NSTableColumn太小而无法包含单元格中约束的最小宽度。因此,对于任何有类似问题的人,我将首先验证这一点。

“有趣”的部分是,这只是 的问题reloadData,而不是正常布局的问题,因为对 的宽度有限制,NSTableView使其无法正常尝试创建这么小的单元格。但是当reloadData被调用时,它显然首先创建了一个新的单元格,其框架大小设置为最小列宽,然后再调整列的大小以适合(如果你有表格设置这样做)。因此,即使一切看起来工作正常,它仍然会在reloadData调用后立即吐出关于不可满足约束的错误,因为单元格视图的初始宽度对于填充等来说太小了。

故事的寓意是始终检查最小 NSTableColumn宽度是否足够大以容纳单元格中的约束,即使您认为列永远不会那么小。IB 使修改约束变得容易,并且在更改单元格中的某些内容后很容易忘记重新检查列宽选项。

于 2013-08-22T21:29:01.583 回答