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).
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. –
Guau, sigue tan mal, ¿tan tarde? Gracias por actualizarnos Dan. – occulus