2011-07-05 10 views
9

Tengo una aplicación que tiene un diseño similar al de iTunes. La ventana principal es una NSSplitView.¿Cambia dinámicamente el contenido de una vista en NSSplitView?

Dependiendo de lo que el usuario seleccione en la columna de la izquierda, necesito mostrar una vista diferente. Por ejemplo, en iTunes si hace clic en "Música" verá una lista de canciones en una tabla, si hace clic en "Programas de TV", veo una pantalla en blanco con algo de texto.

¡Al tratar de resolver esto durante siglos, cualquier indicación en la dirección correcta sería muy útil!

Respuesta

5

En el panel derecho de su NSSplitView puede colocar un NSTabView sin pestañas. Cada pestaña de la vista podría contener una de las vistas que desea visualizar. Luego, en el delegado de la vista de esquema, solo solicite a la vista de pestaña que muestre la vista apropiada cuando se selecciona un elemento en particular.

+0

Hacerlo de esta manera significa que puede hacerlo a través de Xcode (: – Jacob

1

Si tiene una referencia a la vista que 'cambiará' puede, en algún método delgate, agregar una nueva vista como subvista.

+0

No estoy seguro de cómo hacerlo, pero estoy seguro de que sería posible de alguna manera (: – Jacob

2

Este es realmente un trabajo para NSViewController. Usar eso significa que puede poner cada vista en un archivo de punta separado y luego intercambiarlas dentro y fuera según sea necesario. Cuando tenga que alternar las vistas que se puede hacer algo como esto (suponiendo que tiene un NSBox en el panel de la derecha de la NSSplitView)

NSView *musicView = [musicViewController view]; 
[rightPaneBox setContentView:musicView]; 

Editar para ver un ejemplo más completo:

Si usted tiene, por ejemplo, una vista de Música y una vista de TV. Deberías crear dos nuevos archivos semilla, digamos MusicView.nib y TVView.nib y diseñar tus vistas en esos. Luego crearía dos subclases de NSViewController, MusicViewController y TVViewController. En el método init para cada uno de ellos llamarías a [super initWithNib: @ "MusicView.nib" bundle: nil].

luego en sus métodos que seleccionan la nueva vista, llame a [vista de MusicViewController] para obtener una vista para colocar en el lado derecho de NSSplitView.

+0

+1 Eso sería aún mejor, pero no estoy seguro estoy lo suficientemente familiarizado con XCode 4 para poder hacer esto desde cero. ¡Gracias! – Jacob

1

He encontrado una solución diferente después de probar todo tipo de cosas que no funcionaron. El método -replaceSubview: with: casi hace exactamente lo correcto. Para alternar las vistas, todo lo que tiene que hacer es almacenar la vista ahora oculta para su uso posterior.

Para asegurarse de que la vista esté colocada y clasificada correctamente, copie el marco de la vista actual antes de reemplazarlo con la vista siguiente.

Aquí está un extracto de código:

- (void)toggleView 
{ 
    NSArray* views = [splitView subviews]; 
    long count = [views count]; 

    // toggle last subview's contents (either rightmost or bottommost) 
    NSView* currentContentView = [views objectAtIndex:(count - 1)]; 

    [nextContentView setFrame:[currentContentView frame]]; 

    NSView* temp = currentContentView; 

    [splitView replaceSubview:currentContentView with:nextContentView]; 

    nextContentView = temp; 
} 

Usted tendrá que inicializar nextContentView antes de llamar a esto por primera vez. Asigno una salida de referencia desde la vista creada en IB a ella en -applicationDidFinishLaunching.

Cuestiones relacionadas