Включить перетаскивание строки за пределы окна NSOutlineView - PullRequest
0 голосов
/ 04 марта 2019

Как разрешить перетаскивание строк за пределы моего NSOutlineView и в другое приложение (например, Finder, Safari и т. Д.)?

Я попытался реализовать canDragRows:rowIndexes:mouseDownPoint (всегда возвращая true), но я все еще не могу переместить строки.

Редактировать

Вот код, который я использую:

class OutlineView: NSOutlineView {

    var desinationDelegate: DestinationViewDelegate?

    override func awakeFromNib() {
        register(forDraggedTypes: [NSFilenamesPboardType])
        setDraggingSourceOperationMask(.every, forLocal: false)
        verticalMotionCanBeginDrag = true
        draggingDestinationFeedbackStyle = .regular
    }

    override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation {
        return NSDragOperation()
    }

    override func prepareForDragOperation(_ sender: NSDraggingInfo) -> Bool {
        return true
    }

    override func draggingEnded(_ sender: NSDraggingInfo?) {
        guard
            window?.isKeyWindow ?? false,
            let pasteBoard = sender?.draggingPasteboard(),
            let urls = pasteBoard.readObjects(forClasses: [NSURL.self], options: nil) as? [URL],
            urls.count > 0 else {
                return
        }

        desinationDelegate?.receive(urls: urls)
    }

    override func draggingSession(_ session: NSDraggingSession, sourceOperationMaskFor context: NSDraggingContext) -> NSDragOperation {
        return NSDragOperation()
    }

    override func pasteboard(_ sender: NSPasteboard, provideDataForType type: String) {
        sender.setData(desinationDelegate?.item(atRow: selectedRow), forType: NSFilenamesPboardType)
    }

    override func canDragRows(with rowIndexes: IndexSet, at mouseDownPoint: NSPoint) -> Bool {
        return true
    }
}

Редактировать 2

Я добавил

func outlineView(_ outlineView: NSOutlineView, writeItems items: [Any], to pasteboard: NSPasteboard) -> Bool {
    pasteboard.setString("Foo", forType: NSFilenamesPboardType)
    return false
}

вмой ViewController класс (который NSOutlineViewDataSource).setString (или setObject) создает ошибку.Stacktrace:

2019-03-05 15:48:45.659838-0800 Reader[97347:788552] -[NSTaggedPointerString count]: unrecognized selector sent to instance 0x5f49856bc5031b0d
2019-03-05 15:48:51.396627-0800 Reader[97347:788552] [General] -[NSTaggedPointerString count]: unrecognized selector sent to instance 0x5f49856bc5031b0d
2019-03-05 15:48:51.411676-0800 Reader[97347:788552] [General] (
    0   CoreFoundation                      0x00007fff48e73e65 __exceptionPreprocess + 256
    1   libobjc.A.dylib                     0x00007fff74ecf720 objc_exception_throw + 48
    2   CoreFoundation                      0x00007fff48ef122d -[NSObject(NSObject) __retain_OA] + 0
    3   CoreFoundation                      0x00007fff48e15820 ___forwarding___ + 1486
    4   CoreFoundation                      0x00007fff48e151c8 _CF_forwarding_prep_0 + 120
    5   AppKit                              0x00007fff46a57680 +[_NSFilenamesPboardTypeConverter _setConvertedData:pboard:generation:inItem:] + 99
    6   AppKit                              0x00007fff46698565 -[NSPasteboard _setData:forType:index:usesPboardTypes:] + 648
    7   Reader                              0x0000000100011752 $S6Reader14ViewControllerC07outlineB0_10writeItems2toSbSo09NSOutlineB0C_SayypGSo12NSPasteboardCtF + 210
    8   Reader                              0x0000000100011810 $S6Reader14ViewControllerC07outlineB0_10writeItems2toSbSo09NSOutlineB0C_SayypGSo12NSPasteboardCtFTo + 128
    9   AppKit                              0x00007fff46b520f6 -[NSTableView _performClassicDragOfIndexes:hitRow:event:] + 278
    10  AppKit                              0x00007fff466c9378 -[NSTableView _performDragFromMouseDown:] + 474
    11  AppKit                              0x00007fff466c767c -[NSTableView mouseDown:] + 798
    12  AppKit                              0x00007fff466c7148 -[NSOutlineView mouseDown:] + 73
    13  AppKit                              0x00007fff4654bd63 -[NSWindow(NSEventRouting) _handleMouseDownEvent:isDelayedEvent:] + 5668
    14  AppKit                              0x00007fff4647fd8b -[NSWindow(NSEventRouting) _reallySendEvent:isDelayedEvent:] + 2319
    15  AppKit                              0x00007fff4647f231 -[NSWindow(NSEventRouting) sendEvent:] + 481
    16  AppKit                              0x00007fff4631c4a8 -[NSApplication(NSEvent) sendEvent:] + 336
    17  AppKit                              0x00007fff46309cf1 -[NSApplication run] + 755
    18  AppKit                              0x00007fff462f93f7 NSApplicationMain + 780
    19  Reader                              0x0000000100014ead main + 13
    20  libdyld.dylib                       0x00007fff75f9e08d start + 1
)

Edit 3

Я получил возможность перетаскивать ячейки, но, кажется, ничто не исключает их (другими словами, я не могу их никуда уронить).В writeItems:toPasteboard у меня есть следующий код:

    pasteboard.declareTypes([NSURLPboardType], owner: nil)
    pasteboard.setData(item.url.dataRepresentation, forType: NSURLPboardType)
...