2010-10-11 12 views
7

Parece que debería ser fácil pero me falta algo. Tengo una aplicación basada en documentos. También he construido un nuevo XIB que tiene un NSTableView y tres botones en él que pretendo mostrar una lista de archivos anteriores. Deseo que se muestre este XIB en lugar de la ventana del documento cuando se inicia la aplicación por primera vez. Una vez que el usuario selecciona un archivo antiguo o pulsa el botón "Nuevo", deseo ir a la ventana del documento. Esto es muy común y lo he visto usado con bastante frecuencia.Iniciar una aplicación basada en documentos Cocoa muestra la ventana de selección primero

En mi intento de hacer que esto funcione, modifiqué el archivo project-info.plist y cambié el nombre de la base de archivos NIB principal de MyDocument a mi nombre de selección XIB. Esto hace que la aplicación muestre la ventana Selección en lugar de la ventana MyDocument. Parece que no hay problema hasta este punto.

En mi ventana de selección he configurado mi vista de tabla y un controlador de matriz y un controlador de ventana personalizado solo para este XIB. Establecí el propietario del archivo en el controlador de la nueva ventana y vinculé la propiedad de la ventana del controlador de ventana a la ventana y la propiedad de delegar de la ventana al propietario del archivo, así como los botones "Seleccionar", "Cancelar" y "Nuevo". Nada está obligado a NSApplication. Pero lo extraño es que cuando corro esta aplicación parece querer conectar estos controladores a NSApplication con el error (lo mismo para los otros dos botones):

No se pudo conectar el selectButton acción: para apuntar de la clase NSApplication

También muestra un error que NSApplication no cumple con Key-Value para el outlet que contiene referencia a mi matriz. El controlador de la matriz, la ventana y los botones no están vinculados a NSApplication, sino al nuevo controlador de la ventana. Hubiera esperado que si hubiera algún problema, NO mencionaría NSApplication sino el controlador de ventana al que están vinculados los controladores.

¿Alguien sabe lo que está pasando aquí? ¿Es este un problema de acción de objetivo porque cambié el "Nombre de la base de archivos NIB principal" de "Menú principal" a "Selección"? Si no se supone que debo cambiar esto, ¿cómo puedo obtener Cocoa para permitirme mostrar una pantalla de selección antes de mostrar la ventana del documento?

Cualquier ayuda es muy apreciada. Rob

Respuesta

9

La configuración en IB para la clase del propietario del archivo del plumín es solo orientativa; permite que IB muestre solo las salidas y acciones proporcionadas por instancias de esa clase. No hace cumplir que el propietario del archivo será una instancia de esa clase, porque el propietario del archivo no es parte del plumín.

El propietario del archivo es el objeto que carga el plumín. Esto necesariamente significa que está fuera de la punta, y nada en la punta determina nada al respecto. En el caso de la plumilla MainMenu, el propietario del archivo, el objeto que carga la plumilla MainMenu, es la instancia NSApplication. Entonces, todo lo que conectó con el propietario del archivo en su plumilla MainMenu, se conectó al objeto de la aplicación, aunque le dijo a IB que no sería la aplicación.

Que la aplicación sea la propietaria de la plumilla MainMenu, independientemente de lo que le digas al IB, no es el error. La aplicación es siempre el propietario de la plumilla MainMenu. Eso es normal y correcto; no puede cambiarlo, no debe intentar cambiarlo, y no necesita cambiarlo.

El error, en pocas palabras, es que estás usando una punta para dos propósitos muy diferentes.

Debe dejar que MainMenu nib sea eso solo, que solo contenga MainMenu, su controlador de documentos personalizado (voy a acceder a eso en un momento), y su aplicación delegue, y mueva la ventana de documentos anteriores a otra plumín, propiedad del controlador de ventana de documentos anteriores. Para que un controlador de ventana sea el propietario de este plumín, es necesario que el controlador de ventana lo cargue. Debe hacer eso en código: no puede configurarlo en IB o en un plist.

En el delegado de su aplicación, cree una instancia y posea el controlador de la ventana. Parece que creó una subclase NSWindowController personalizada, por lo que puede anular su init para que se envíe el mensaje initWithWindowNibName: para cargar y poseer el plumín. Luego, solo use alloc y init para crear el controlador de ventana del delegado de la aplicación.

Eso eliminará el mensaje de la consola y se asegurará de que los botones estén realmente conectados al controlador de la ventana (porque están conectados al propietario del archivo, que, con este cambio, será el controlador de la ventana) .

Haga que su delegado de aplicación responda al applicationOpenUntitledFile: enviando al controlador de ventana el mensaje showWindow:. Esto hará que la ventana de documentos anteriores aparezca cada vez que el usuario normalmente habría creado un nuevo documento.

Si quieres apoyar a los métodos habituales de creación de documentos (es decir, permitir que un documento nuevo al trabajo), a continuación, poner en práctica y applicationDidFinishLaunching:applicationShouldHandleReopen:hasVisibleWindows:, no applicationOpenUntitledFile:. Asegúrese de que no haya documentos abiertos y muestre su ventana si ese es el caso.

También debe hacer una subclase personalizada de NSDocumentController y hacer que su controlador de documento de una instancia de eso, y en esa clase, implementar addDocument: y removeDocument: para volver a mostrar la ventana anterior-documentos cuando el último documento abierto está cerrado, y ocultarlo cuando se abre un documento.

+0

Esto ayudó mucho. Algo de lo que me sorprendió es que las aplicaciones de documentos que usan datos centrales no crean automáticamente el delegado de la aplicación. Una vez que creé el delegado, pude detener la creación automática y luego abrir mi ventana inicial. ¡Muchas gracias! – Rob

Cuestiones relacionadas