NSTableRowView странное поведение при перетаскивании (продолжает вставлять NSView в иерархию представлений)

Я заметил странное поведение в моем приложении и не могу найти способ его исправить: у меня есть NSOutlineView с пользовательским NSTableRowView и поддержкой перетаскивания.

Когда я перетаскиваю элемент (файл, например) на первый план, он рисует правильную подсветку (я переопределил drawDraggingDestinationFeedbackInRect), но при втором перетаскивании у меня появляется эта синяя подсветка, и если я отлаживаю иерархию представления, я вижу, что NSView добавляется в строку,

Я добавил небольшую анимацию, которая показывает, что именно происходит (я также добавил NSTableView с тем же NSTableRowView):

Вверху: NSOutlineView

Внизу: NSTableView

Просмотр иерархии (для NSOutlineView):

Вот мой код для NSTableRowView

import Cocoa

class TestRowView: NSTableRowView {

    override func drawSelectionInRect(dirtyRect: NSRect) {
        NSColor.yellowColor().setFill()
        NSBezierPath(rect: self.bounds).fill()
    }

    override func drawDraggingDestinationFeedbackInRect(dirtyRect: NSRect) {
        NSColor.greenColor().setFill()
        NSBezierPath(rect: self.bounds).fill()
    }

}

Вот источники данных и методы делегата для NSOutlineView:

func outlineView(outlineView: NSOutlineView, numberOfChildrenOfItem item: AnyObject?) -> Int {
    return item == nil ? allItems.count : 0
}

func outlineView(outlineView: NSOutlineView, isItemExpandable item: AnyObject) -> Bool {
    return false
}

func outlineView(outlineView: NSOutlineView, child index: Int, ofItem item: AnyObject?) -> AnyObject {
    return allItems[index]
}

func outlineView(outlineView: NSOutlineView, viewForTableColumn tableColumn: NSTableColumn?, item: AnyObject) -> NSView? {
    return outlineView.makeViewWithIdentifier("DataCell", owner: self)
}

func outlineView(outlineView: NSOutlineView, rowViewForItem item: AnyObject) -> NSTableRowView? {
    return TestRowView()
}

func outlineView(outlineView: NSOutlineView, heightOfRowByItem item: AnyObject) -> CGFloat {
    return 60.0
}

func outlineView(outlineView: NSOutlineView, objectValueForTableColumn tableColumn: NSTableColumn?, byItem item: AnyObject?) -> AnyObject? {
    return item
}

func outlineView(outlineView: NSOutlineView, acceptDrop info: NSDraggingInfo, item: AnyObject?, childIndex index: Int) -> Bool {
    return true
}

func outlineView(outlineView: NSOutlineView, validateDrop info: NSDraggingInfo, proposedItem item: AnyObject?, proposedChildIndex index: Int) -> NSDragOperation {
    return .Copy
}

Что я пробовал:

  1. Создание подкласса NSOutlineView и переопределение acceptsFirstResponder

  2. Переопределение backgroundStyle

  3. Пробовал другой выбор HighlightStyle's
  4. Используется NSTableViewDraggingDestinationFeedbackStyleNone

1 ответ

Я нашел своего рода решение моей проблемы, вот что я сделал:

Первое - подкласс NSOutlineView с переопределением следующего свойства:

override var acceptsFirstResponder: Bool{
    get{
        return false
    }
}

Во-вторых, в моем подклассе NSTableRowView я добавил следующее:

override var selectionHighlightStyle: NSTableViewSelectionHighlightStyle {
    get{
        return self.emphasized ? .None:.Regular
    }
    set{

    }
}

Я не могу сказать, что это хорошее решение или даже полное решение, но лучше, чем ничего.

Иногда я все еще получаю серый фон, поэтому я также добавил проверку в сеттер override var backgroundStyle : NSBackgroundStyle свойство внутри моего подкласса NSTableCellView.

Другие вопросы по тегам