gpt4 book ai didi

swift - NSTableRowView 拖放时的奇怪行为(在 View 层次结构中不断插入 NSView)

转载 作者:行者123 更新时间:2023-11-28 08:34:39 27 4
gpt4 key购买 nike

我注意到我的应用程序出现了奇怪的行为,但找不到修复它的方法:我有 NSOutlineView 和自定义 NSTableRowView 并支持拖放。

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

我附上了小动画,它准确地显示了发生了什么(我还添加了具有相同 NSTableRowViewNSTableView):

顶部:NSOutlineView

底部:NSTableView

enter image description here

View 层次结构(对于 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 的数据源和委托(delegate)方法:

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. 覆盖背景样式

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

最佳答案

我已经找到了一种解决我的问题的方法,这是我所做的:

首先 - 重写以下属性的 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 中添加了一个检查。

关于swift - NSTableRowView 拖放时的奇怪行为(在 View 层次结构中不断插入 NSView),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38146977/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com