我注意到我的应用程序中有奇怪的行为,但找不到解决方法:我有NSOutlineView和自定义NSTableRowView并支持拖放。
当我首先在大纲视图上拖动项目(例如文件)时,它会绘制正确的突出显示(我已经覆盖drawDraggingDestinationFeedbackInRect),但是在第二次拖动时,我有这个蓝色突出显示,如果我调试视图层次结构,我可以看到NSView被添加到行.
我附上了一个小动画,它准确地显示了发生了什么(我还添加了具有相同NSTableRowView的NSTableView):
顶部: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 并覆盖 AcceptFirstResponder
覆盖背景样式
- 尝试了不同的 selectionHighlightStyle 的
- 使用 NSTableViewDraggingDestinationFeedbackStyleNone