Я устанавливаю тривиальное представление на основе NSTableView, это простое 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
}
, а затем я включаю перетаскивание элементов с помощью этого метода делегата:
func tableView(_ tableView: NSTableView, pasteboardWriterForRow row: Int)
-> NSPasteboardWriting?
{
return MyPasteboardItem(value: data[row])
}
Это работает, но когда я перетаскиваю строку, я получаю пустое представление текстового поля:
(в другой настройке такие вещи, как изображения и кнопки, прорисовываются, но NSTextField также становится белым).
Я очень подозреваю, что это связано с тем, что NSTextField поддерживается TextLayer, который не рисуется, еслиtableview захватывает изображение перетаскиваемой иерархии представления.
Какой хороший способ это исправить?Я подумал о реализации draw()
, но хорошо.
Обновление: если я делаю собственный подкласс NSTextField и переопределяю draw()
, он действительно начинает работать:
final class MyTextField : NSTextField {
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
}
}
Глядя на вещьв представлении отладчик показывает, что Layer переключается с NSTextLayer
на _NSViewBackingLayer
, когда draw
переопределяется.Но я предполагаю, что это не совсем желательно?Есть ли лучший способ сделать это?
Полный образец: https://gist.github.com/helje5/48728983951ab3362af43b967c554475