NSTableRowView拖放时奇怪的行为(继续在视图层次结构中插入NSView)

时间:2016-07-01 13:40:32

标签: swift cocoa drag-and-drop nsview nstablerowview

我注意到我的应用中存在奇怪的行为,无法找到修复方法: 我有 NSOutlineView ,其中包含自定义 NSTableRowView 并支持拖放。

当我首先在outlineview上拖动项目(例如文件)时,它会绘制正确的高光(我已覆盖 drawDraggingDestinationFeedbackInRect ),但在第二次拖动时,我有这个蓝色突出显示,如果我调试视图层次结构我可以看到 NSView 被添加到行中。

我附上了一个小动画,其中显示了发生了什么(我还添加了 NSTableView NSTableRowView 相同):

顶部: NSOutlineView

底部: NSTableView

enter image description here

查看层次结构(对于NSOutlineView):

enter image description here

以下是 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进行子类化并覆盖acceptFirstResponder

  2. 覆盖backgroundStyle

  3. 尝试了不同的selectionHighlightStyle
  4. 使用NSTableViewDraggingDestinationFeedbackStyleNone

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法,这就是我所做的:

首先 - 使用以下属性覆盖 NSOutlineView 的子类:

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

其次在我的 NSTableRowView 子类中,我添加了以下内容:

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

    }
}

我不能说这是一个很好的解决方案,甚至不是一个完整的解决方案,但总比没有好。

有时我仍然会获得灰色背景,所以我还在 NSTableCellView 子类中的override var backgroundStyle : NSBackgroundStyle属性的setter中添加了一个检查。