Cocoa 基于视图的NSTableView:拖动时为空/白色标签

Cocoa 基于视图的NSTableView:拖动时为空/白色标签,cocoa,drag-and-drop,nstableview,appkit,Cocoa,Drag And Drop,Nstableview,Appkit,我设置了一个基于普通视图的NSTableView,该视图是一个用作标签的简单NSTextField: func tableView(tv:NSTableView,tc:NSTableColumn?的视图,行:Int) ->NSView? { 设v=(tv.makeView(标识符:viewID,所有者:nil)为?NSTextField) ??NSTextField() v、 isSelectable=false v、 isEditable=false v、 stringValue=数据[行]/

我设置了一个基于普通视图的NSTableView,该视图是一个用作标签的简单NSTextField:

func tableView(tv:NSTableView,tc:NSTableColumn?的视图,行:Int)
->NSView?
{
设v=(tv.makeView(标识符:viewID,所有者:nil)为?NSTextField)
??NSTextField()
v、 isSelectable=false
v、 isEditable=false
v、 stringValue=数据[行]/[字符串]
v、 标识符=视图ID
返回v
}
然后使用此委托方法启用项目的拖动:

func tableView(tableView:NSTableView,pasteboardWriterForRow行:Int)
->你在写什么?
{
返回MyPasteboardItem(值:数据[行])
}
这是可行的,但当我拖动行时,会得到文本字段的空表示:

(在不同的设置中,会绘制图像视图和按钮等内容,但NSTextField也会以白色结束)

我高度怀疑这是由于NSTextField由TextLayer支持,如果tableview捕获了正在拖动的视图层次的图像,则不会绘制TextLayer

解决这个问题的好方法是什么?我考虑过实现
draw()
,但效果不错

更新:如果我创建自己的NSTextField子类并覆盖
draw()
,它确实开始工作:

final class MyTextField : NSTextField {
  override func draw(_ dirtyRect: NSRect) {
    super.draw(dirtyRect)
  }
}
查看视图调试器中的对象显示,当覆盖
draw
时,层从
NSTextLayer
切换到
\NSViewBackingLayer
。 但我认为这并不完全可取?有没有更好的方法来实现这一点


完整示例:

在文本字段上设置drawsBackground=false为我修复了它

如果您使用的是xib文件,则在文本字段或viewFor:方法中取消勾选“绘制背景”,类似于:

v.drawsBackground = false;

我在一个NSTextField子类中得到了这个结果,不确定这是否是一个好主意:

覆盖公共函数绘图(\udirtyrect:NSRect){
//这将从“NSTextLayer”支持的UXLabel切换到
//“\n查看BackingLayer”,这可能不可取。
//但是:这样可以正确绘制拖放单元格。
超级绘图(直接绘图)
}