Search code examples
swiftmacoscocoansoutlineview

How would you implement multiple items using NSOUtlineViews's pasteboardWriterForItem:


I am using an NSOutlineView with drag and drop support. There is an NSOutlineViewDataSource function entitled outlineView(_:pasteboardWriterForItem:).

This call serializes the item passed into the function and allows the user to retrieve the serialized item in outlineView(_:acceptDrop:item:childIndex:)

@MainActor optional func outlineView(
    _ outlineView: NSOutlineView,
    acceptDrop info: NSDraggingInfo,
    item: Any?,
    childIndex index: Int
) -> Bool

That being said, I don't understand how I would write multiple rows of data using outlineView(_:pasteboardWriterForItem:) . It gets called for each item being moved, but the pasteboard only keeps a reference to the last item. Apple deprecated several multiple row write/move functions.

How should I implement this? I have tried several solutions but they're hacky and seem like they're not the canonical solution.


Solution

  • The information is in the info parameter.

    There is an API enumerateDraggingItems(options:for:classes:searchOptions:using:) of NSDraggingInfo to enumerate and proceed the items.

    In outlineView(_:pasteboardWriterForItem:) you usually just

    return item as? NSPasteboardWriting