objective-c cocoa macos dock

objective c - ¿Cómo reacciono a una aplicación de OS X cuando un archivo, imagen, etc. cae en su icono de base?



objective-c cocoa (2)

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 se hace esto? Me gustaría utilizar Cocoa y Objective-C, pero estoy interesado en cualquier solución en cualquier idioma.


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

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

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

- (BOOL)applicationOpenUntitledFile:(NSApplication *)theApplication

se llama.

Consulte la referencia de la clase NSApplication

Básicamente puedes simplemente crear cualquier objeto de cualquier tipo (por ejemplo, uno simple que simplemente hereda de NSObject), definir los dos métodos de arriba dentro del objeto y luego en cualquier lugar en el código de inicio de la aplicación que haces

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

Y eso es. 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 sucede realmente detrás de escena es que Launch Services envía a su aplicación 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.


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.

Entonces, ¿su aplicación está basada en documentos? Si es así, ¿es el archivo del tipo que te registraste?

Para más información: