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