gpt4 book ai didi

cocoa - 基于 View 的 NSTableView : Empty/white labels on dragging

转载 作者:行者123 更新时间:2023-12-03 17:46:38 27 4
gpt4 key购买 nike

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

  func tableView(_ tv: NSTableView, viewFor tc: NSTableColumn?, row: Int)
-> NSView?
{
let v = (tv.makeView(withIdentifier: viewID, owner: nil) as? NSTextField)
?? NSTextField()
v.isSelectable = false
v.isEditable = false
v.stringValue = data[row] // [String]
v.identifier = viewID
return v
}

然后我使用此委托(delegate)方法启用项目拖动:

  func tableView(_ tableView: NSTableView, pasteboardWriterForRow row: Int)
-> NSPasteboardWriting?
{
return MyPasteboardItem(value: data[row])
}

这可行,但是当我拖动行时,我得到文本字段的空表示:

Empty NSTextField on drag

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

我高度怀疑这是由于 NSTextField 由 TextLayer 支持,如果 tableview 捕获了被拖动的 View 层次结构的图像,则不会绘制该 TextLayer。

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

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

final class MyTextField : NSTextField {
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
}
}

查看 View 调试器中的内容显示,当覆盖 draw 时,图层从 NSTextLayer 切换到 _NSViewBackingLayer。但我认为这并不完全理想?有没有更好的方法来实现这一点?

完整示例:https://gist.github.com/helje5/48728983951ab3362af43b967c554475

最佳答案

在文本字段上设置drawsBackground = false为我解决了这个问题。

如果您使用的是 xib 文件,请取消选中文本字段或 viewFor: 方法中的“绘制背景”,如下所示:

v.drawsBackground = false;

关于cocoa - 基于 View 的 NSTableView : Empty/white labels on dragging,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55242877/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com