2010-05-04 23 views
6

Estoy tratando de cambiar el controlador de vista maestra (que aparece en el popover en vertical, y en el lado izquierdo en el paisaje) en un UISplitViewController. Me gustaría cambiar entre el controlador de vista maestra que es uno de los dos UIViewControllers (dependiendo de una acción tomada en otra parte de mi aplicación).UISplitViewController no puede cambiar el controlador de vista maestro?

estoy usando los siguientes:

mySplitViewController.viewControllers = [arrayWithObjects NSArray: newMasterController, detailController, nil];

Esto cambia correctamente el controlador de vista maestro como cabría esperar en modo apaisado. Sin embargo, hace no parece cambiar el controlador de vista utilizado para el popover en modo vertical.

Observé que el elemento de barra para mostrar que este controlador de vista maestra está llamando a showMasterInPopover: en el controlador splitview, por lo que también se espera que funcione en modo vertical, pero no es así.

De hecho, puede establecer el controlador de vista maestros, véase la nueva viewController correctamente en modo horizontal, gire hacia atrás a vertical, y la viewcontroller utilizado en el popover es todavía la antigua.

¿Esto es un error?

Respuesta

1

ACTUALIZADO: por favor, lea la actualización final en la parte inferior! La respuesta original + actualización a continuación puede no ser útil.

Acabamos de tener exactamente el mismo problema. A veces me pregunto si Apple realmente prueba las clases que escriben con algo parecido a casos de uso realistas, porque UISplitViewController no es su mejor momento.

El problema es que cuando reemplaza el controlador de vista maestra en la vista dividida, el código dentro de UISplitViewController no actualiza la propiedad contentViewController de su controlador popover. El resultado es que el controlador de popover todavía tiene un identificador en un controlador de vista desactualizado, lo que resulta en que aparezcan viejas IU, o incluso fallas de memoria, cuando está en modo vertical.

Aquí está nuestra solución.

Supongo que tiene una clase de conformidad UISplitViewControllerDelegate que almacena popoverController como una propiedad de clase (consulte el código de ejemplo estándar para UISplitViewController).

En el punto en el que se establece el nuevo controlador de vista maestra, también es necesario actualizar el contentViewController, de la siguiente manera:

mySplitViewController.viewControllers 
    = [NSArray arrayWithObjects:newMasterController, detailController, nil]; 

// in the cases where the uisplitview has already shown a popovercontroller, 
// we force the popovercontroller to update its content view controller. 
// This ensures any old content view in popover actually gets released by 
// the popovercontroller. 
if (popoverController) { 
    [popoverController setContentViewController:theMasterViewController 
           animated:NO];  
} 

También debe establecer contentViewController del popover cuando su UISplitViewControllerDelegate se informó que el popover controlador se va a presentar un controlador de vista:

- (void)splitViewController:(UISplitViewController*)svc 
     popoverController:(UIPopoverController*)pc 
     willPresentViewController:(UIViewController *)aViewController 
{ 
    // set the popoverController property - as per Apple's sample code 
    self.popoverController = pc; 

    // THE LINE BELOW IS THE NEW LINE! 
    [popoverController setContentViewController:aViewController animated:NO]; 

sí, ya sé que el código anterior se ve loco, y te preguntas por qué apple no podría simplemente establecer el contenido de controlador de vista a sí mismos. Pero aparentemente no, y esta es la solución.

ACTUALIZACIÓN

El esquema anterior, con la configuración de la vista de contenido, resulta que no funciona después de todo. Por ejemplo, si configura la vista de contenido para que sea un controlador de navegación, más adelante pasará la vista raíz dentro del controlador de navegación, en lugar del controlador de navegación. UISplitViewController simplemente no maneja el cambio de la vista maestra de ninguna manera viable, hasta donde puedo ver.

La solución alternativa que tengo actualmente es instalar un UINavigationController como vista maestra y cambiar el controlador de vista raíz de ese controlador de navegación. Así que tengo que cambiar la vista maestra 'por la puerta trasera', de alguna manera.

ACTUALIZACIÓN 2

que darse por vencido. El enfoque en la primera actualización anterior también tiene fallas; Tengo problemas en la rotación todavía. Básicamente, parece que si usa UISplitViewController, no debe intentar ningún cambio del controlador de vista maestra (incluso si está cambiando la vista maestra cuando la vista maestra, por ejemplo, como un popover, se ha ocultado de nuevo). Jugando con los contenidos de un UINavigationController en la vista maestra (mientras que la vista maestra muestra) parece que va a estar bien, pero cualquier cosa más allá de eso lleva a un problema tras otro.

Nota técnica: Creo que los problemas provienen de una aparente debilidad en el manejo de IU de Apple: es decir, el código de Apple llamará a liberación en UIViews y el controlador una vez oculto o eliminado de la vista, pero luego, si el viewcontroller contiene se muestra de nuevo, envíe mensajes diferidos como viewDidDisappear a las vistas/controladores liberados (que en ese momento pueden haberse desasignado).

+0

Hay muchísimos defectos con UISplitViewController. Esto parece ser uno de los peores. Todavía estoy viendo estos problemas a partir de iOS SDK 5.1. Sin embargo, parece que la solución que implica el uso de un UINavigationController como la Vista maestra raíz funciona en esta versión. –

+0

Guau, sigue tan mal, ¿tan tarde? Gracias por actualizarnos Dan. – occulus

2

En caso de que alguien está buscando una solución a este problema (o una palabra-alrededor), que tenía un problema similar y trabajé un vistazo aquí: Changing the master view in Split View does not update the popover in portrait

Básicamente, he usado un controlador de navegación para la vista maestra controlador, y controles de vista empujados/apilados dentro de ese controlador de navegación, para cambiar los controladores de vista en la vista maestra mientras se sigue mostrando el controlador de vista correcto en orientación vertical, en la vista emergente.

Cuestiones relacionadas