2009-02-01 6 views
14

Algunas aplicaciones, como Photoshop, permiten a los usuarios arrastrar una imagen desde un navegador web o arrastrar un archivo desde el sistema de archivos al icono de la aplicación en el dock. Al hacer esto, se abre el archivo en esa aplicación.¿Cómo reacciono a una aplicación OS X cuando un archivo, imagen, etc. cae en su icono de base?

¿Cómo se hace esto? Me gustaría utilizar Cocoa y Objective-C, pero estoy interesado en cualquier solución en cualquier idioma.

+0

No creo que pueda usar Cocoa y C#.Solo sé de enlaces de Cocoa de Ruby, Python y Objective-C (con Objective-C siendo el mejor compatible, según tengo entendido). Si bien puedes escribir aplicaciones OS X utilizando C# con Mono, no creo que puedas usar Cocoa de C#. – Andy

+1

Buscar Cocoa # Andy. –

Respuesta

4

Si su aplicación está basada en documentos y completó las claves necesarias en su Info.plist correctamente, entonces solo funciona. Cuando el usuario arrastra un archivo al mosaico del Dock de su aplicación, Dock resaltará su aplicación en el mosaico si el archivo es del tipo que se inscribió, y si el usuario descarta el archivo allí, NSDocumentController instanciará una de sus clases de documentos para el archivo. Si el archivo no es del tipo que se registró, ambos lo ignorarán.

¿Su aplicación está basada en documentos? Si es así, ¿es el archivo del tipo que se registró?

Para más información:

+0

Enlace actual a "Guía de programación de aplicaciones basada en documentos para Mac" es https://developer.apple.com/library/mac/documentation/DataManagement/Conceptual/DocBasedAppProgrammingGuideForOSX/Introduction/Introduction.html – canhazbits

19

NSApplication le permite configurar un delegado para su aplicación. Si el usuario arrastra un archivo en el icono de la base, NSApplication llamará al método

- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename 

de su objeto delegado, en caso de que implementa dicho método. En caso de que el contenido no es realmente un archivo (por ejemplo, si el usuario simplemente selecciona texto en una aplicación y lo arrastra en su icono de la base), el método delegado

- (BOOL)applicationOpenUntitledFile:(NSApplication *)theApplication 

se llama.

Ver NSApplication class reference

Básicamente se puede simplemente crear cualquier objeto de cualquier tipo (por ejemplo, un sencillo que simplemente hereda de NSObject), definen los dos métodos de más arriba dentro del objeto y luego en cualquier lugar de su puesta en marcha código de la aplicación que hace

whatever = [[YourObject alloc] init]; 
[[NSApplication sharedApplication] setDelegate:whatever]; 

Y eso es todo. Tan pronto como un archivo o algún otro contenido se coloca en el icono del Dock, se llama al método apropiado y debe manejar esa solicitud. Por cierto, se invocan los mismos métodos si su aplicación se asocia con un tipo de archivo (por ejemplo, .myFileType) y el usuario hace doble clic en un archivo con esa extensión en el Finder.

Lo que realmente sucede entre bastidores es que Launch Services envía su aplicación a un evento de Apple de "documentos abiertos" ('odoc'). NSApplication registra de forma predeterminada un identificador para este evento y reenvía la solicitud llamando al método delegado apropiado. También puedes escuchar directamente este evento de Apple, supongo, pero ¿por qué lo harías? Lidiar directamente con Apple Events es incómodo. Cuando su aplicación no es Cocoa, sino Carbon (plain-C), es posible que deba procesar directamente el evento de Apple (no estoy familiarizado con Carbon), pero en Cocoa Apple ya atrapa los eventos de Apple más importantes para usted y los convierte. en llamadas de delegado o notificaciones que su aplicación puede escuchar.

Cuestiones relacionadas