Перетаскивание не работает для NSTableView - PullRequest
0 голосов
/ 19 мая 2011

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

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

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

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

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

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

1 Ответ

5 голосов
/ 19 мая 2011

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

"... но когда мы перетаскиваем изображение в 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 и он зарегистрирован для типов данных, которые вы хотите.

...