A partir de una muestra de aplicaciones basadas en documentos ventana de selección de cacao primero

StackOverflow https://stackoverflow.com/questions/3903264

Pregunta

Esta parece que debería ser fácil sin embargo, debe estar pasando algo. Tengo una aplicación basada en documentos. También he construido un nuevo XI ter que tiene un NSTableView y tres botones en él que tengo la intención de mostrar una lista de los archivos anteriores. Me gustaría que este XI ter que se mostrará en lugar de la ventana del documento cuando la aplicación inicia por primera vez. Una vez que el usuario selecciona un archivo antiguo o golpea el botón "Nuevo" Deseo y luego ir a la ventana del documento. Esto es muy común y que he visto utilizado con bastante frecuencia.

En mis intentos de conseguir este trabajo he modificado el archivo info.plist-proyecto y ha cambiado el archivo principal de la SEMILLA Nombre base de MiDocumento a mi nombre Selección XI ter. Esto hace que la aplicación para mostrar la ventana de selección en lugar de la ventana Mi Documento. No parece haber ningún problema hasta este punto.

En la ventana de selección que he levantado mi vista de tabla y un controlador de array y un controlador de ventana a medida solo para esta XI ter. He puesto propietario del archivo para el nuevo controlador de ventana y con destino propiedad de la ventana del controlador de la ventana a la ventana y la propiedad delegado de la ventana de botones de "nuevos" el propietario del archivo, así como el "Seleccionar", "Cancelar", y. 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: a meta de la clase NSApplication

También muestra un error que NSApplication no es compatible con valor-clave para la toma de corriente que sostiene referencia a mi matriz. La matriz de controlador, ventana, y los botones no están obligados a NSApplication sino al nuevo controlador de ventana. Yo habría esperado que si había algún problema no se menciona NSApplication sino más bien el controlador de ventana a la que están obligados los controladores.

Alguien sabe lo que está pasando aquí? ¿Es un problema Target-acción porque he cambiado el "archivo principal SEMILLA Nombre base" de "Menú Principal" a la "selección"? Si no se supone que cambiar esto, entonces, ¿cómo puedo obtener Cacao me permite mostrar una pantalla de selección antes de mostrar la ventana del documento?

Cualquier ayuda es muy apreciada. Rob

¿Fue útil?

Solución

La configuración de IB para la clase de propietario del archivo de la punta es meramente consultivo; que permite IB mostrar sólo los puntos de venta y acciones que son proporcionados por las instancias de esa clase. No hace cumplir que propietario del archivo será una instancia de esa clase, porque propietario del archivo no es parte de la punta.

propietario del archivo es el objeto de que las cargas de la punta. Este necesariamente significa que está fuera de la punta, y nada en la punta determina nada al respecto. En el caso de la punta MainMenu, de su propietario del archivo en el objeto que carga el MainMenu plumín es el NSApplication ejemplo. Por lo tanto, todo lo que se conectó a propietario del archivo en su plumín de MainMenu, te engancha hasta el objeto de aplicación, a pesar de que dicho IB que no sería la aplicación.

Que la aplicación es el propietario de la MainMenu plumín independientemente de lo que diga que no IB-es el error. La aplicación es siempre el dueño de la punta MainMenu. Eso es normal y correcto; usted no puede cambiarlo, no debe tratar de cambiarlo, y no es necesario cambiarlo.

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

Se debe dejar que la semilla sea MainMenu que sólo el MainMenu que contienen solo, su controlador documento personalizado (Voy a llegar a eso en un momento), y su aplicación delegado y mover los anteriores documentos-ventana en una punta separada , propiedad del controlador de ventana anterior-documentos. Con el fin de tener un controlador de ventana Sea el dueño de esta semilla, es necesario tener la carga de controlador de ventana de la misma. Debe hacerlo en código no se puede establecer que en IB o en un plist.

En el delegado de su aplicación, instantiate y posee el controlador de ventana. Parece que usted ha hecho una costumbre NSWindowController subclase, por lo que puede invalidar su init tener que enviar el mensaje en sí initWithWindowNibName: de carga y posee la punta. A continuación, sólo tiene que utilizar alloc y init para crear el controlador de ventana desde el delegado de la aplicación.

Esto se librará del mensaje de la consola, y asegurarse de que los botones están realmente conectados al controlador de ventana (porque son de hasta enganchado al propietario del archivo, el cual, con este cambio, será el controlador de ventana).

Tenga su aplicación delegado responden a applicationOpenUntitledFile: mediante el envío de la ventana del controlador el mensaje showWindow:. Esto hará que la ventana anterior-documentos aparece 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 Nuevo documento para el trabajo), a continuación, poner en práctica y applicationDidFinishLaunching: applicationShouldHandleReopen:hasVisibleWindows:, no applicationOpenUntitledFile:. Asegúrese de que no hay documentos abiertos, y muestran su ventana si ese es el caso.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top