NSPasteBoard для перетаскивания

Я пытаюсь переместить NSCollectionViewItem в пределах того же NSCollectionView, чтобы разрешить переупорядочивание элементов. Элемент представления коллекции - это настраиваемый элемент, представляющий несколько меток со строками из настраиваемого объекта Parameter:

class Parameter: NSObject {

var parameterName: String
var parameterNominal: Double
var parameterUpperTolerance: Double
var parameterLowerTolerance: Double
var parameterDistribution: String
var parameterNotes: String
var parameterDataArray: [Double]

// MARK: - Initialization Methods
...
}

Теперь мне нужно записать весь элемент / объект в «NSPasteboard», чтобы правильно использовать перетаскивание в NSCollectionView? Большинство примеров перетаскивания работают с записью строк на монтажный стол с использованием ....register(forDraggedTypes: [NSPasteboardTypeString]).

В настоящее время я записываю одну из строк элементов в монтажный стол, и перетаскивание начинается нормально:

func collectionView(_ collectionView: NSCollectionView, pasteboardWriterForItemAt indexPath: IndexPath) -> NSPasteboardWriting? {
    let pb = NSPasteboardItem()
    pb.setString(ParameterList.sharedInstance.parameters[indexPath.item].parameterName, forType: NSPasteboardTypeString)
    return pb
}

... но кажется странным записывать на монтажный стол только часть объекта, когда требуется перемещение всего объекта, не так ли?

Как я могу на самом деле записать свой объект параметра на монтажный стол (при необходимости)?

Что происходит за сценой с данными на монтажном столе при использовании перетаскивания?

Большое спасибо!


person JFS    schedule 16.03.2018    source источник


Ответы (1)


Я не использовал монтажный стол с представлениями коллекций, но у меня есть представления контуров. Если вы просто переупорядочиваете внутренне перетаскиваемые элементы, вам действительно не нужно полностью использовать функцию вставки - она ​​предназначена для передачи общих типов между приложениями.

Вы можете просто сделать эквивалент этого:

func outlineView(_ outlineView: NSOutlineView, pasteboardWriterForItem item: Any) -> NSPasteboardWriting? {
    pasteboardItem.setString("Something to pass - not used", forType:MyConstants.pasteboardType)
    return pasteboardItem
}

Вам понадобится какой-то способ внутреннего кэширования перетаскиваемых элементов в приведенной выше функции. Затем в раскрывающемся списке «Принять» вы можете просто проверить тип монтажного стола и использовать кеш.

person Giles    schedule 23.03.2018
comment
Спасибо за ответ. Поскольку перетаскивание уже работало, все же хорошо, если вам не нужно помещать все на монтажный стол. Вся концепция перетаскивания NSCollectionView по-прежнему остается для меня чудом и не всегда очевидна для того, чего я пытаюсь достичь. - person JFS; 23.03.2018