Просмотр на основе NSTableView: пустые / белые метки при перетаскивании - PullRequest
0 голосов
/ 19 марта 2019

Я устанавливаю тривиальное представление на основе 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])
  }

Это работает, но когда я перетаскиваю строку, я получаю пустое представление текстового поля:

Empty NSTextField on drag

(в другой настройке такие вещи, как изображения и кнопки, прорисовываются, но 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

...