Перетаскивание не работает для NSTableView

Я реализовал функцию перетаскивания в моем приложении. Все функции хороши, но когда мы перетаскиваем изображение в NSTableView,

- (BOOL)performDragOperation:(id < NSDraggingInfo >)sender

метод не вызывается.

Кто-нибудь может сказать мне причину, по которой этот метод не вызывается?

Даже если я реализую это тоже...

- (BOOL)prepareForDragOperation:(id < NSDraggingInfo >)sender

1 ответ

Нам нужно намного больше информации.

"... но когда мы перетаскиваем изображение в NSTableView"

Что вы подразумеваете под "изображением" и откуда (из какого приложения) вы перетаскиваете это изображение? Например, вы имеете в виду файл изображения (Picture.png) из Finder, который вы перетаскиваете в представление таблицы в вашем приложении? Или из собственного приложения вы перетаскиваете какое-то изображение из одного места в табличное представление?

Это ваш собственный подкласс NSTableView? Потому что это единственное место, которое вы увидите -performDragOperation: или же -prepareForDragOperation: будучи призванным По умолчанию, NSTableView переопределяет эти примитивные методы NSDraggingDestination для реализации своих собственных методов, ориентированных на табличное представление, таких как упомянутый Бавариус (-tableView:validateDrop:proposedRow:proposedDropOperation:, -tableView:acceptDrop:row:dropOperation:, так далее.). Если вы говорите о том, что эти методы не вызываются в NSTableView подкласс, затем помните, что документация заявляет для -prepareForDragOperation::

Этот метод вызывается только в том случае, если самое последнее сообщение draggingEntered: или draggingUpdated: вернуло допустимое значение операции перетаскивания

Итак, сначала вы должны убедиться, что вы зарегистрировались для типов перетаскивания, которые вы хотите, а затем вам нужно реализовать -draggingEntered,

Если, с другой стороны, вы не говорите о NSTableView подкласс, но класс внешнего контроллера, то да, те, performDragOperation: а также prepareForDragOperation: не призваны к этому. Другими словами, если у вас есть класс контроллера, скажем, MDAppController он должен быть делегатом и источником данных NSTableView, -performDragOperation: а также prepareForDragOperation: из MDAppController не будет звонить. Эти методы предназначены для NSView занятия на базе. По этой причине, NSTableView имеет следующий метод, определенный в NSTableViewDataSource протокол: tableView:validateDrop:proposedRow:proposedDropOperation:, Если вы реализуете это в своем классе контроллера, он должен вызываться при условии, что вы правильно настроили tableView и он зарегистрирован для типов данных, которые вы хотите.

Другие вопросы по тегам