2011-12-19 6 views
8

Tengo una aplicación simple que maneja información de marketing. Lo que hice fue llamar aAceptación de archivos arrastrados en una aplicación Cocoa

NSInteger result = [openPanel runModalForDirectory:nil file:nil types:fileTypes]; 

Cuando el usuario hace clic en el menú File->Open. Ahora me pidieron que agregue funciones de arrastrar y soltar a la aplicación para que el usuario pueda arrastrar un archivo hacia ella en lugar de tener que ir al menú o presionar el comando + o para abrir un archivo.

Antes de que me diga ir a leer la documentación Ya reviso el Intro to drag and drop de Apple y otros documentos. Aún así no puedo entender qué hacer.

Soy un viejo programador de Unix C que necesito copiar con esto y algunas de las suposiciones en el documento de Apple no tienen sentido para mí.

En pocas palabras, ¿qué necesito para añadir a mi aplicación a:

  1. poder arrastrar y soltar
  2. manija que arrastraba archivo

Como nota, debería manejar una sola archivo a la vez.

Gracias por la ayuda

Respuesta

15

Bueno, lo que necesita para implementar el protocolo NSDraggingDestination, que supongo que usted ha leído ya. Puede implementarlo en una vista específica o en toda la ventana; parece que está aceptando arrastres de archivos a nivel de aplicación, por lo que probablemente quiera que toda la ventana acepte el arrastre. De todos modos, una vez que lo hagas funcionar, verás cómo personalizarlo aún más.

Subclase NSWindow. El primer paso es especificar qué tipo de lastres está interesado en

Informe a su ventana personalizada que está interesado en los nombres de archivo:.

- (void)awakeFromNib { 
    [self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]]; 
} 

Tell OS X qué tipo de cursor en la pantalla:

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender { 
    return NSDragOperationCopy; 
} 

- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender { 
    return NSDragOperationCopy; 
} 

¿Tienen el arrastre:

- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender { 
    NSPasteboard *pboard = [sender draggingPasteboard]; 
    NSArray *filenames = [pboard propertyListForType:NSFilenamesPboardType]; 

    if (1 == filenames.count) 
     if ([[NSApp delegate] respondsToSelector:@selector(application:openFile:)]) 
      return [[NSApp delegate] application:NSApp openFile:[filenames lastObject]]; 

    return NO; 
} 

Esto es lo mínimo para que funcione.

+0

Ok, gracias por la información. Cuando coloco '[self registerForDraggedTypes: [NSArray arrayWithObject: NSFilenamesPboardType]];' a 'awakeFromNib' obtengo una excepción yy: *** Aplicación de terminación debido a excepción no detectada 'NSInvalidArgumentException', razón: '- [MyAppAppDelegate registerForDraggedTypes:] : selector no reconocido enviado a la instancia 0x100141330 ' –

+0

Oh, también agregando '[self registerForDraggedTypes: [NSArray arrayWithObject: NSFilenamesPboardType]];' me da una advertencia: Método -registerForDraggedTypes no encontrado –

+0

Debe llamar a ese método en la ventana o ver eso aceptando drags. Prefiero llamarlo desde la ventana en sí, en 'awakeFromNib' en mi subclase NSWindow. –

Cuestiones relacionadas