Перетаскивать файлы в NSTableView?
-
03-07-2019 - |
Вопрос
У меня есть 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, а не в дополнение к нему.Кроме того, почти всегда является нарушением проблем, когда представление является делегатом для другого объекта.