Вопрос

У меня есть NSTableView на который я хочу разрешить пользователям перетаскивать видеофайлы.Когда они удалят файл, он будет добавлен в виде строки в табличном представлении.

Как бы я это сделал на твоем месте?В настоящее время tableview берет свои данные из контроллера массива (который берет свои данные из NSMutableArray)

Я нашел это документация, но, похоже, не может заставить ее работать..

У меня есть..

  • создал класс "TableCon" (который я изменил, чтобы наследовать от NSTableView, а не NSObject)
  • изменил класс NSTableView на TableCon
  • установите выход делегата NSTableView для этого класса
  • вызванный registerForDraggedTypes в инициализации TableCon
  • реализованный - (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender; (снова в TableCon)

..но, ничего, он ведет себя так, как будто я никогда ничего не менял (никаких ошибок), что я делаю не так?

Редактировать: Я попытался реализовать предложение Боаза Столлера, а также обнаружил это описание решения (the первый ответ включает решение к первому сообщению).Итак, что я сделал сейчас, так это..

  • Подкласс NSArrayController, который передает содержимое в табличное представление (TableListCon)
  • Добавить tableView выход к TableListCon (и указал его на NSTableView)
  • Реализуйте validateDrop, writeRowsWithIndexes и acceptDrop в TableListCon
  • Вызвал registerForDraggedTypes на выходе TableView.

Опять же, никаких ошибок / предупреждений, но, похоже, вызывается только метод awakeFromNib (ни один из других методов не вызывается)

Это было полезно?

Решение

NSTableView обрабатывает перетаскивание иначе, чем общие представления, что в целом хорошо.Это означает, что вам не нужно вручную обрабатывать сложные операции выделения, отслеживания ячеек и вставки, которые требуются таблицам.

Описание того, что требуется, можно найти здесь.По сути, вы все еще вызываете -registerDraggedTypes:(обычно в вашем методе -awakeFromNib) но вместо реализации методов NSDraggingDestination вы реализуете различные методы источника данных, связанные с перетаскиванием, которые можно найти здесь.Вам не нужно создавать подкласс NSTableView для реализации перетаскивания таким образом.

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

Другие советы

В дополнение к тому, что сказал Боаз, похоже, что вы создаете подкласс NSTableView, а затем делаете экземпляр этого подкласса делегатом NSTableView.Если вы собираетесь создать подкласс, этот подкласс следует использовать вместо NSTableView, а не в дополнение к нему.Кроме того, почти всегда является нарушением проблем, когда представление является делегатом для другого объекта.

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