NSTableView и NSOutlineView перетаскивание - PullRequest
8 голосов
/ 16 марта 2009

У меня есть NSTableView и NSOutlineView, оба из которых имеют привязку к содержимому, и я хотел бы иметь некоторые функции перетаскивания:

  • Перетащите строки из таблицы A на строку Outline B, где они будут скопированы в структуру данных, которую представляет строка в Outline B.

  • Перетащите строку из Outline B на другую строку в Outline B, которая скопирует данные, представленные первой строкой, в данные, представленные во второй строке.

Я прочитал документацию Apple по перетаскиванию и получил почти нигде. Похоже, это не относится к тому, что мне нужно делать. Чего мне не хватает?

Ответы [ 3 ]

7 голосов
/ 16 марта 2009

На странице, на которую вы ссылаетесь, довольно четко указано, что вам нужно делать. В источнике данных таблицы А. внедрите registerForDraggedTypes: и tableView:writeRowsWithIndexes:toPasteboard:, чтобы поместить некоторые личные данные TableAPasteboardType в монтажную панель.

В источнике данных схемы B реализуйте те же два метода и поместите некоторые личные данные OutlineBPasteboardType в монтажный картон.

Наконец, внедрите tableView:validateDrop:proposedRow:proposedDropOperation: и tableView:acceptDrop:row:dropOperation:, чтобы проверить монтажную панель на TableAPasteboardType или OutlineBPasteboardType и внести соответствующие изменения в связанную модель, в зависимости.

Это довольно просто, когда вы просто пашете и делаете это.

5 голосов
/ 01 сентября 2012

В 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. Если метод toPasteboard: возвращает YES, перетаскивание начинается.
  2. validateDrop: метод контролирует, какой целевой узел разрешен, путем обновления маркера в представлении
  3. Возвращать YES для метода acceptDrop: если удаление прошло успешно

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

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

5 голосов
/ 16 марта 2009

Вам нужен источник данных - AFAIK, вы не можете этого добиться только с помощью привязок.

Незаконченный Adium Xtras Creator, на который распространяется лицензия BSD, включает в себя контроллер массива, который можно установить в качестве источника данных для перетаскивания в табличном представлении на основе Bindings .

Это требование может не применяться к NSOutlineView и NSTreeController. Я этого не пробовал.

...