Перетаскивание NSTableView и NSOutlineView
-
19-08-2019 - |
Вопрос
У меня есть NSTableView и NSOutlineView, оба с их содержимым, предоставляемым привязками, которые я хотел бы иметь с некоторой функциональностью перетаскивания:
Перетащите строки из таблицы A на строка структуры B, откуда они будут скопированы в структуру данных, которую представляет строка в структуре B.
Перетащите строку из контура B на другая строка в схеме B, которая скопирует данные, представленные первой строкой, в данные, представленные во второй строке.
Я читал Документация Apple по перетаскиванию и почти ничего не добился.Похоже, на самом деле это не относится к тому, что мне нужно сделать.Что я упускаю из виду?
Решение
Вам нужен источник данных — AFAIK, вы не можете сделать это с помощью одних только привязок.
Незаконченный Adium Xtras Creator, находящийся под лицензией BSD, включает контроллер массива, который вы можете установить в качестве источника данных для получения перетаскивания в табличном представлении с привязками.
Это требование может не применяться к NSOutlineView и NSTreeController.Я этого не пробовал.
Другие советы
Страница, на которую вы ссылаетесь, довольно четко описывает, что вам нужно сделать.В источнике данных таблицы A реализуйте registerForDraggedTypes:
и tableView:writeRowsWithIndexes:toPasteboard:
, чтобы поместить некоторые частные TableAPasteboardType
данные на картоне.
В источнике данных outline B реализуйте те же два метода и поместите некоторые частные OutlineBPasteboardType
данные на картоне.
Наконец, внедрите tableView:validateDrop:proposedRow:proposedDropOperation:
и tableView:acceptDrop:row:dropOperation:
чтобы проверить картонную упаковку на наличие либо TableAPasteboardType
или OutlineBPasteboardType
и внесите соответствующие изменения в вашу связанную модель, в зависимости от обстоятельств.
Это довольно просто, стоит вам просто взяться за дело и сделать это.
В macOS 10.7 для реализации этого были добавлены некоторые новые протоколы.
Существует отсутствие документации для таблиц на данный момент, но вы можете найти несколько хороших примеров:
Для NSTableViwew протокол NSTableViewDataSource определяет следующие методы:
(BOOL)tableView:writeRowsWithIndexes:toPasteboard:
tableView:validateDrop:proposedRow:proposedDropOperation:
tableView:acceptDrop:row:dropOperation:
Для NSOutlineView протокол NSOutlineViewDataSource определяет следующие методы:
(BOOL)outlineView:writeItems:toPasteboard:
(NSDragOperation)outlineView:validateDrop:proposedItem:proposedChildIndex:
(BOOL)outlineView:acceptDrop:item:childIndex:
Это минимальные требования, которые необходимо реализовать для каждого типа представления.Варианты использования очень похожи.
- Если верхняя картонная:метод возвращает YES, перетаскивание начато.
- Проверенный поток:метод определяет, какой целевой узел разрешен, обновляя маркер в представлении
- Верните YES для acceptDrop:метод, если удаление было успешным
Это приводит к двум случаям дополнительного использования, которыми вам приходится управлять.Первый - это перетаскивание в пределах одного вида или одна и та же операция между двумя видами.Кроме того, вы можете различать операции перемещения, копирования или удаления.Хорошим примером является то, как точки останова работают с drag & drop в Xcode.
В TableView есть несколько дополнительных методов для настройки drag & drop, но те, которые я упомянул, являются ключевыми методами для того, чтобы заставить его работать.