调用NSTableRowView布局后,布局仍需要更新。

4
我在我的应用程序中有两个NSTableView,用户可以从表A拖放项目到表B。当将项拖动到表B时,Xcode会给我以下布局警告消息:

调用-[NSTableRowView layout]后仍然需要更新布局。 NSTableRowView或其超类之一可能已覆盖-layout而没有调用super。或者,某些内容可能已在更新布局的中间污染了布局。 这两种情况都是Cocoa Autolayout中的编程错误。如果某些使用Cocoa Autolayout之前的类具有称为layout的方法,则前者很可能会出现,但应该进行修复。

只有当将项目拖到表B时才会发生这种情况。除此之外,在IB中没有自动布局警告,布局中的所有内容看起来都设置正确。有人知道上述消息试图告诉我什么吗?表格正在使用标准的Cocoa类(而非子类化)。
2个回答

3

我解决了这个问题(或者说是绕过了它),方法是不允许除 NSTableViewDropOperation.Above 之外的其他拖放操作类型。在此之前,用户可以将它们拖放到其他行上,而不仅仅是在行之间。但我只想让它们在行之间拖放,所以这对我来说没问题。以下是解决问题的代码:

func tableView(aTableView:NSTableView, validateDrop info:NSDraggingInfo, proposedRow row:Int, proposedDropOperation operation:NSTableViewDropOperation) -> NSDragOperation
{
    if (operation == .Above) { return .Move; }
    return .None;
}

1
你找到了解决方案,可以在行上而不是它们之间进行拖放吗? - Just a coder

1
在我的情况下,警告略有不同。
布局仍然需要在调用-[NSView layout]之后更新。NSView或其超类之一可能已覆盖-layout而没有调用super。或者,在更新布局的过程中,某些内容可能已经变脏了。这两种情况都是Cocoa Autolayout中的编程错误。如果一些使用Cocoa Autolayout之前的类有一个名为layout的方法,则前者很可能会出现,但应该进行修复。
不同的类NSView。
无论如何,在我的情况下,我可以通过将NSScrollView的translatesAutoresizingMaskIntoConstraints设置为false来解决此问题。
顺便说一下,autoresizingMask和autoresizesSubviews根本不需要触摸。
警告只是意味着我必须手动设置属性,否则它将产生错误的约束。但找出有问题的对象非常困难。我必须迭代所有视图节点以检查属性状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接