Вопрос

У меня есть 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:

Это минимальные требования, которые необходимо реализовать для каждого типа представления.Варианты использования очень похожи.

  1. Если верхняя картонная:метод возвращает YES, перетаскивание начато.
  2. Проверенный поток:метод определяет, какой целевой узел разрешен, обновляя маркер в представлении
  3. Верните YES для acceptDrop:метод, если удаление было успешным

Это приводит к двум случаям дополнительного использования, которыми вам приходится управлять.Первый - это перетаскивание в пределах одного вида или одна и та же операция между двумя видами.Кроме того, вы можете различать операции перемещения, копирования или удаления.Хорошим примером является то, как точки останова работают с drag & drop в Xcode.

В TableView есть несколько дополнительных методов для настройки drag & drop, но те, которые я упомянул, являются ключевыми методами для того, чтобы заставить его работать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top