【问题标题】:NSTableView Drag&Drop selected rows overrides row layout in blueNSTableView Drag&Drop 选择的行覆盖蓝色的行布局
【发布时间】:2026-01-21 13:50:01
【问题描述】:

我有一个 NSTableView,它在每一行中显示一些图像和一个文本。我为 NSTableView 启用了多项选择。我为 TableView 启用了 Drag&Drop 来排序或导出图像。 现在发生的情况是,当我选择多行并将它们拖到 TableView 上时,整行变为蓝色并保持蓝色(选中)。看不到文字和图片。 在 XCode 中,我收到以下消息:

调用 -[NSTableRowView 布局] 后布局仍然需要更新。 NSTableRowView 或其超类之一可能在不调用 super 的情况下覆盖了 -layout。或者,某些东西可能在更新过程中弄脏了布局。两者都是 Cocoa Autolayout 中的编程错误。如果某些 Cocoa 之前的 Autolayout 类有一个称为 layout 的方法,则很可能会出现前者,但它应该被修复。

问题只存在于多选。启用单个选择时,它工作正常。

这里有三张图来说明问题:

图2:拖过去时变成蓝色;覆盖其他布局组件

http://ekiwi.de/temp/*/original2.png

图 3:拖动后仍为蓝色

http://ekiwi.de/temp/*/original3.png

到目前为止,我通过谷歌搜索两天没有找到任何解决方案或提示。也许这里有人有提示?

【问题讨论】:

  • 你在这方面有什么收获吗?我对 NSOutlineView 有类似的问题。就我而言,我可以通过将突出显示样式更改为源列表来解决此问题。我还在一个非常简单的测试项目中重新创建了它,所以我怀疑这是一个 Apple 错误并已提交 Radar。
  • 我在自己的应用程序中也遇到过这个错误,它使用基于视图的 NSOutlineView。我可以添加的唯一额外信息是,至少对于我的应用程序,这个错误只发生在优胜美地,而不是小牛队。 Gavin,如果你的雷达上还有那个测试项目,你介意在某个地方发布一个副本吗?
  • 有什么解决办法吗?
  • 这可能是相关的:*.com/questions/30621573/…

标签: xcode cocoa selection nstableview multiple-select


【解决方案1】:

我终于能够通过设置行视图的selectionHighlightStyle 来覆盖蓝色选择颜色。我的NSTableRowView 子类中的以下代码起到了作用:

- (NSTableViewSelectionHighlightStyle)selectionHighlightStyle
{
    return NSTableViewSelectionHighlightStyleNone;
}

- (void)drawSelectionInRect:(NSRect)dirtyRect
{
    [[NSColor redColor] set];
    NSRectFill(dirtyRect);
}

【讨论】: