objective c - Arrastrando archivos a otras aplicaciones en Cocoa OSX
objective-c macos (1)
Estoy intentando convertir una aplicación de Windows en OSX, todo está funcionando ahora, excepto esta pequeña característica, la función de arrastrar y soltar archivos desde mi aplicación a cualquier otra ventana que admita gotas. Recibir gotas es fácil, el problema es ser la fuente de los datos para arrastrar.
Mi aplicación solo tiene 1 ventana con 1 vista, yo dibujo todos los controles allí. Así que simplemente extendí mi vista como esta @interface NativeView : NSView <NSDraggingSource, NSPasteboardItemDataProvider>
.
Ahora, el resto del código que tengo hasta ahora debería funcionar en mi opinión, pero de nuevo no sé mucho sobre el cacao y la OSX:
NSArray *fileList = [NSArray arrayWithObjects:&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];
FileList es una matriz de NSString*
. Y donde veas view
significa la interfaz NativeView
, se implementa de esta manera porque está codificada dentro de C ++;
Actualmente, el código bloquea cuando intento establecer el pbItem
en el pbItem
. Quiero decir que nada más se ejecuta más allá de esa línea. También traté de deshacerme de NSPasteboard
todo junto y usar NSPasteboardItem
solamente, pero obtengo un EXC_BAD_ACCESS ejecutando la última línea: beginDraggingSessionWithItems
.
No encontré ningún ejemplo en línea sobre cómo arrastrar archivos, todo lo que es NSImage
y no me sirve para ese tipo de arrastre.
Cualquier ayuda será bienvenida, gracias.
Sí, falta bastante la documentación en línea.
Intenta usar el siguiente enfoque:
auto* dragItems = [[NSMutableArray alloc] init];
for (auto& 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]