Cocoa 基于视图的NSTableView:拖动时为空/白色标签
我设置了一个基于普通视图的NSTableView,该视图是一个用作标签的简单NSTextField: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=数据[行]/
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”,这可能不可取。
//但是:这样可以正确绘制拖放单元格。
超级绘图(直接绘图)
}