2010-07-17 16 views
6

Así que estoy empezando a aprender a usar Cocoa. Creo que casi lo tengo, pero estoy obsesionado con la creación y el cambio de vistas. Estoy reescribiendo un juego que hice hace un rato para practicar. Todo lo que quiero es una ventana (preferiblemente no redimensionable) y quiero poder cambiar las vistas para diferentes pantallas en el juego.¿Cómo cambio las Vistas en una aplicación Cocoa?

Primero, tengo el menú principal (Iniciar juego, Puntuaciones altas, Salir). Entonces necesito una ventana para cada pantalla (pantalla de juego, pantalla de puntuación más alta).

Lo que me confunde es cómo diseñar esto. Busqué NSViewController pensando que administra las vistas, pero no es así. Solo administra una vista al cargarla realmente. No entiendo por qué necesitaría usar NSViewController entonces. ¿No podría simplemente tener una clase de ventana que contiene múltiples subclases de NSView y cargarlas así? No estoy seguro de entender el propósito del ViewController.

¿Mi Window Class realmente necesita la subclase NSWindowController? Intenté seguir el ejemplo del ejemplo ViewController de Apple y tiene una clase de controlador de ventana que es una subclase de NSWindowController. No veo cuál era el propósito de subclasificar eso. Parece que todo NSWindowController agrega - initWithPath:(NSString *)newPath pero no veo el uso en eso cuando puedo simplemente editar el archivo plist para abrir la ventana en el inicio. El ejemplo de Apple también tiene una variable NSView y una variable NSViewController. ¿No solo necesitas una variable para almacenar la vista actual?

Gracias de antemano chicos, estoy muy confundido sobre cómo funciona esto.

Respuesta

1

Use siguientes funciones definidas en UIVew (que forma parte de la ventana existente)

- (void)addSubview:(UIView *)view 
- (void)removeFromSuperview 
+0

Estoy haciendo Cocoa en el escritorio ahora mismo. –

+2

misma interfaz disponible en el escritorio (NSView) –

+0

Entonces, lo que me gustaría saber es por qué debería usar NSViewController. ¿Debería? ¿Debo hacer una subclase de NSWindowController con una variable NSView y NSViewController? No estoy seguro de qué es realmente necesario para hacer una ventana con vistas intercambiables. Según entiendo, no necesito NSViewController, pero no lo sé, ya que el ejemplo de Apple lo usó y se supone que te facilitará las cosas. –

5

Se utiliza NSWindowController y NSViewController para gestionar una ventana o una vista, ya que sólo debería ser necesario para crear subclases de NSWindow o NSView para nuevos "tipos" de ventana o vista. Por ejemplo, si quisiera usar una ventana circular, subclase NSWindow. Si solo desea tener controles en una ventana, la subclase NSWindowController.

Es lo mismo con NSViewController: una vista general NSViewController's será de alguna clase de base como NSView (o tal vez su propia subclase NSView que dibuja un fondo personalizado). El NSViewController gestiona la interacción entre las subvistas de esa vista, lo que le permite actuar como una sola unidad dentro de su aplicación más grande.

Piénselo de esta manera: las vistas dibujan y convierten eventos de entrada sin procesar en acciones de nivel superior. Los controladores proporcionan información a las vistas y manejan las acciones.

Componer cosas de esta manera puede mejorar enormemente la modularidad de su código, facilitando el diseño, la escritura y la depuración.

+0

Supongo que tiene más sentido. ¿Crees que tendría que usar 'initWithNibName: bundle:' para cargar la vista o podría simplemente configurar el "Propietario del archivo" en ViewController? –

+0

Tienes que hacer ambas cosas. Utiliza '-initWithNibName: bundle:' para crear una instancia de su subclase NSViewController. Eso carga el archivo de punta especificado y actúa como el propietario del archivo; configure la clase del propietario del archivo del plumín en su subclase NSViewController y señale el punto de vista "Propietario" del propietario del archivo a su vista. –

4

Parece que estás tratando de cambiar la vista de contenido dentro de una ventana? Si ese es el caso, puede usar -[NSView replaceSubview:with:] con -[NSWindow contentView] como receptor.

Supongamos que tiene una página de título llamada titleView y una página de menú llamada menuView y desea intercambiarlas dentro y fuera de la ventana principal de la aplicación.Si la página de título es visible y el usuario hace clic en un botón "menú principal" o enlace, que pondría algo como esto en el método delegado del botón:

[[[NSApp mainWindow] contentView] replaceSubview:titleView with:menuView]; 

Dos cosas a tener en cuenta:

  1. La vista anterior, titleView en este caso, se libera mediante esta llamada. Si desea que aún esté disponible, deberá hacerlo al retain antes de reemplazarlo.
  2. La vista principal no cambiará de tamaño si sus páginas tienen diferentes dimensiones. Cambiar el tamaño del marco de la ventana, y por lo tanto el contentView es bastante fácil, pero puede agregar un poco de Core Animation en la mezcla para darle un poco de estilo.

Espero que esto ayude!

+0

Muy bien, gracias! Voy a investigar eso también. Ustedes son todos realmente útiles. –

0

Soy nuevo en cocoa pero creo que su aplicación realmente no requiere un NSViewController. Un NSViewController desempeña el papel de "Controlador" en el patrón de diseño de MVC. Entonces 'controla' todas las acciones, la lógica del pegamento, dentro de una sola vista.

Por ejemplo, en una vista con múltiples controles: botones, tablas, casillas de verificación :, campos de texto, selectores de fecha, etc., es probable que existan interacciones detalladas entre los controles que requieren enlaces y actualizaciones. Por ejemplo, un clic de botón carga una búsqueda de base de datos, con manejo de errores y validación. Esa lógica de pegamento entra en la clase NSViewController.

En su aplicación, parece que cada vista es una página simple con poca necesidad de control de nivel de vista. Entonces, probablemente necesite un solo NSWindowController, un controlador para manejar la lógica y los eventos para la transición de página a página.

Una técnica para manejar vistas múltiples que llenan una sola ventana es usar un NSTabView y establecer el estilo de tabulación en 'sin bordes' en IB. Luego use la acción del botón para seleccionar el NSTabViewItem requerido. Durante el desarrollo, configure el estilo de tabview en 'pestañas superiores' e IB le permite desplazarse por las subvistas que desea visualizar.

Cuestiones relacionadas