Перетащите файлы на NSTableView? - PullRequest
12 голосов
/ 04 мая 2009

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

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

Я нашел эту документацию, но не могу заставить ее работать ..

У меня есть ..

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

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

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

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

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

Ответы [ 2 ]

21 голосов
/ 04 мая 2009

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

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

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

1 голос
/ 05 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...