#objective-c #macos #cocoa #drag-and-drop #nspasteboard
#objective-c #macos #cocoa #перетаскивание #nspasteboard
Вопрос:
Я пытаюсь преобразовать приложение Windows в OSX, теперь все работает, кроме этой небольшой функции, перетаскивания файлов из моего приложения в любое другое окно, поддерживающее drops. Получение отбрасываемых файлов легко, проблема заключается в том, чтобы быть источником данных для перетаскивания.
В моем приложении есть только 1 окно с 1 представлением, я сам рисую каждый элемент управления там. Поэтому я просто расширил свой взгляд следующим @interface NativeView : NSView <NSDraggingSource, NSPasteboardItemDataProvider>
образом.
Теперь, на мой взгляд, обновление кода, которое у меня есть до сих пор, должно работать, но опять же, я не так много знаю о cocoa и OSX:
NSArray *fileList = [NSArray arrayWithObjects:amp;pathList[0] count:pathList.size()];
NSPasteboard *pboard = [NSPasteboard pasteboardWithName: NSDragPboard];
[pboard declareTypes:[NSArray arrayWithObject:NSFilenamesPboardType] owner:nil];
[pboard setPropertyList:fileList forType:NSFilenamesPboardType];
NSPasteboardItem *pbItem = [NSPasteboardItem new];
[pbItem setDataProvider:view forTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];
[pbItem pasteboard:pboard provideDataForType:NSFilenamesPboardType];
NSDraggingItem *dragItem = [[NSDraggingItem alloc] initWithPasteboardWriter:pbItem];
[dragItem setDraggingFrame:NSMakeRect(0, 0, 10, 10)];
[view beginDraggingSessionWithItems:[NSArray arrayWithObjects:dragItem, nil] event:mouseEvent source:view];
Список файлов представляет собой массив NSString*
. И там, где вы видите view
, это означает интерфейс NativeView
, он реализован таким образом, потому что он закодирован в C ;
В настоящее время код блокируется, когда я пытаюсь установить pasteboard
в pbItem
. Я имею в виду, что после этой строки больше ничего не выполняется. Я также пытался избавиться от NSPasteboard
all together и использовать NSPasteboardItem
only, но я получаю EXC_BAD_ACCESS, выполняющий последнюю строку: beginDraggingSessionWithItems
.
Я не нашел в Интернете никаких примеров перетаскивания файлов, все, что есть NSImage
, и я не использую этот тип перетаскивания.
Любая помощь будет приветствоваться, спасибо.
Ответ №1:
Да, онлайн-документации довольно не хватает.
Попробуйте использовать следующий подход:
auto* dragItems = [[NSMutableArray alloc] init];
for (autoamp; path : pathList)
{
auto* fileURL = [NSURL fileURLWithPath: path];
auto* dragItem = [[NSDraggingItem alloc] initWithPasteboardWriter: fileURL];
[dragItem setDraggingFrame: NSMakeRect(0, 0, 10, 10)];
[dragItems addObject: dragItem];
}
[view beginDraggingSessionWithItems: dragItems
event: mouseEvent
source: view]