1

アプリの奇妙な動作に気づき、それを修正する方法が見つかりません。カスタムNSTableRowViewとドラッグ アンド ドロップをサポートするNSOutlineViewがあります。

アイテム(ファイルなど)を最初にoutlineviewにドラッグすると、正しいハイライトが描画されます( drawDraggingDestinationFeedbackInRectをオーバーライドしました)が、2回目のドラッグでこの青いハイライトが表示され、ビュー階層をデバッグすると、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
}

私が試したこと:

  1. NSOutlineView をサブクラス化し、acceptsFirstResponder をオーバーライドする

  2. backgroundStyle のオーバーライド

  3. 別の selectionHighlightStyle を試しました
  4. NSTableViewDraggingDestinationFeedbackStyleNone を使用
4

1 に答える 1

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内のプロパティのセッター内にチェックを追加しました。

于 2016-07-02T20:37:55.487 に答える