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

时间:2015-06-03 13:29:56

标签: macos swift cocoa autolayout nstableview

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

  

调用后仍需要更新布局 - [NSTableRowView布局]。   NSTableRowView或其中一个超类可能已重写-layout   没有打电话超级。或者,某些东西可能会有污垢的布局   更新它的中间。两者都是Cocoa中的编程错误   自动布局。如果有一些前Cocoa,前者很可能会出现   Autolayout类有一个名为layout的方法,但应该修复它。

只有当项目被拖到表B时才会发生这种情况。我在IB中没有自动布局警告,布局中的所有内容看起来都正确设置。有人知道上面的消息试图告诉我什么吗?这些表使用标准的Cocoa类(不是子类)。

2 个答案:

答案 0 :(得分:3)

我修复了它(或者更确切地说是围绕它),除了NSTableViewDropOperation.Above之外不允许使用drop操作类型。在用户将放到其他行之前,而不仅仅是行之间。但我希望它们只允许在行之间删除,这样对我来说没问题。这是修复它的代码:

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

答案 1 :(得分:1)

就我而言,警告略有不同。

  

调用后仍需要更新布局 - [NSView布局]。 NSView或   其中一个超类可能在没有调用的情况下覆盖了--layout   超。或者,在更新过程中可能会出现脏污布局   它。两者都是Cocoa Autolayout中的编程错误。前者是   如果一些pre-Cocoa Autolayout类有一个方法,很可能会出现   叫布局,但应该修复。

不同的班级NSView

无论如何,我可以通过设置translatesAutoresizingMaskIntoConstraints == false的{​​{1}}来解决此问题。

对于记录,NSScrollViewautoresizingMask根本不需要触及。

警告只是意味着我必须手动设置属性,否则会产生错误的约束。但弄清楚有问题的对象是非常困难的。我必须迭代所有视图节点以检查属性状态。