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
}
Что я пробовал:
Создание подкласса NSOutlineView и переопределение acceptsFirstResponder
Переопределение backgroundStyle
- Пробовал другой выбор HighlightStyle's
- Используется 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.