我注意到我的应用中存在奇怪的行为,无法找到修复方法: 我有 NSOutlineView ,其中包含自定义 NSTableRowView 并支持拖放。
当我首先在outlineview上拖动项目(例如文件)时,它会绘制正确的高光(我已覆盖 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进行子类化并覆盖acceptFirstResponder
覆盖backgroundStyle
答案 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中添加了一个检查。