drag-and-drop - Mojave - 如果写入的项目多于拖动的行,则从 NSTableView 拖放会失败

标签 drag-and-drop nstableview macos-mojave

在 OSX Mojave 中拖动多个项目时出现此错误:

[General] There are 2 items on the pasteboard, but 1 drag images. There must be 1 draggingItem per pasteboardItem.
2018-09-05 14:09:57.176486+0200 TableViewPasteboardCrash[3106:66642] [General] (
    0   CoreFoundation                      0x00007fff4c1dd43d __exceptionPreprocess + 256
    1   libobjc.A.dylib                     0x00007fff7802b720 objc_exception_throw + 48
    2   CoreFoundation                      0x00007fff4c1dd26f +[NSException raise:format:] + 201
    3   AppKit                              0x00007fff49a03387 -[NSDraggingSession(NSInternal) _initWithPasteboard:image:offset:source:] + 247
    4   AppKit                              0x00007fff49a02d9f -[NSCoreDragManager dragImage:fromWindow:at:offset:event:pasteboard:source:slideBack:] + 1919
    5   AppKit                              0x00007fff49a02611 -[NSWindow(NSDrag) dragImage:at:offset:event:pasteboard:source:slideBack:] + 134
    6   AppKit                              0x00007fff49eb9a75 -[NSTableView _doImageDragUsingRowsWithIndexes:event:pasteboard:source:slideBack:startRow:] + 656
    7   AppKit                              0x00007fff49eb9f09 -[NSTableView __doImageDragUsingRowsWithIndexes:event:pasteboard:source:slideBack:startRow:] + 276
    8   AppKit                              0x00007fff49ebac9e -[NSTableView _performClassicDragOfIndexes:hitRow:event:] + 466
    9   AppKit                              0x00007fff49a31cf8 -[NSTableView _performDragFromMouseDown:] + 474
    10  AppKit                              0x00007fff49a2fffc -[NSTableView mouseDown:] + 798
    11  AppKit                              0x00007fff498b46ef -[NSWindow(NSEventRouting) _handleMouseDownEvent:isDelayedEvent:] + 5668
    12  AppKit                              0x00007fff497e872f -[NSWindow(NSEventRouting) _reallySendEvent:isDelayedEvent:] + 2319
    13  AppKit                              0x00007fff497e7bd5 -[NSWindow(NSEventRouting) sendEvent:] + 481
)

有人有同样的问题或拖动多个项目的解决方案吗?

最佳答案

这看起来像是 macOS 10.14 中的一个错误。
实际上有一个rdar:https://openradar.appspot.com/44135683

同时,有一个简单的解决方法。

我假设您正在使用 NSPasteboard.writeItems ,具有实现 NSPasteboardWriting 的自定义数据类.

我可以肯定地确认这会在 macOS 10.14 上崩溃。

而不是 NSPasteboardWriting ,你应该采用NSCoding .

这意味着实现:

然后,不要使用 NSPasteboard.writeItems ,使用NSPasteboard.setPropertyList :

let items = [ MyItem ]() /* MyItem conforms to NSCoding */

/* Retrieve items */

pboard.setPropertyList( items, forType: "someTypeString" )

这不会因多个项目而崩溃。
然后,您将能够使用 NSPasteboard.propertyList 检索您的元素。 :

let items = pboard.propertyList( forType: "someTypeString" ) as? [ MyItem ]

关于drag-and-drop - Mojave - 如果写入的项目多于拖动的行,则从 NSTableView 拖放会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52730740/

相关文章:

javascript - document.elementFromPoint(x, y) 未报告正确的子元素

javascript - 拖放检查

cocoa - NSTableView 与自定义 NSColumnHeaderCell

macos - 子类 NSView 而不是 NSTableCellView

cocoa - 更新深色模式: NSColor ignores appearance changes?

python - OOP Python 网络套接字

java - Matlab 将文件从 Windows 资源管理器拖放到图形 (gui)

javascript - HTML5 拖放占位符在离开时将parentNode 设置为 null (js vanilla)

objective-c - 如何在 View 顶部添加模糊 View ?

macos - NSButton attributeTitle 在按钮按下时改变颜色