Pregunta

La premisa es muy sencilla:. Quiero mostrar una vista modal en una aplicación para iPad que utiliza un UISplitViewController

La jerarquía de vistas es directa:

                                              /- TableViewController1
                     /- root:TabBarController -- TableViewController2
SplitViewController -
                     \- detail:CustomViewController

Cuando hago clic en una de las celdas de la tabla en TableViewController1, que abrir una vista modal:

- (void)tableView:(UITableView *)tv didSelectRowAtIndexPath:(NSIndexPath *)ip {
  UIViewController *vc = [[MyModalClass alloc] init];
  UINavigationController *nc = [[UINavigationController alloc]
                                initWithRootViewController:vc];
  nc.modalPresentationStyle = UIModalPresentationFormSheet;
  nc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
  [self presentModalViewController:nc animated:true];
  [nc release];
  [vc release];
}

Esto funciona muy bien: los aparezca vista. Los problemas comienzan cuando intento para descartarlo en cualquier orientación distinta de paisaje.

En ModalViewController, el método siguiente se desencadena por un UITabBarButton en la barra de navegación:

- (void) closeButtonInNavBarWasClicked:(id)sender {
  [self dismissModalViewControllerAnimated:true];
}

Y aquí es donde empiezan los problemas.

Cuando este código se llama, la vista modal desaparece, pero: la tabBarController (de la vista dividida vista raíz) es repente girar y cambiar de tamaño. El contenido es de repente hacia los lados, y cubre parcialmente la vista de detalles. La vista de detalles no cambia de tamaño para ser más pequeño, es sólo parcialmente cubierto por la vista raíz.

La única situación en la que este problema no aparece es cuando me toque en la célula TableViewController1 cuando la aplicación está en modo vertical. A pesar de la vista raíz estar en un popover (que podría ser una amplia fuente de errores), todo funciona bien.

Algunas cosas que ya han intentado, sin éxito:

  • Volcado de la barra de pestañas, simplemente mostrar TableViewController1 como el controlador de la raíz de la vista dividida
  • Crear un protocolo de delegado para que el padre TableViewController1 descarta la vista modal en lugar de los MyModalClass vista en sí.
  • Presentar / salida de la vista modal en TableViewController1.splitViewController realidad empeora las cosas:. La vista ni siquiera aparece
  • El sacrificio de varias cabras también no ayuda.

Le agradecería enormemente cualquier entrada sobre este tema.

¿Fue útil?

Solución

Tengo una clase-de-respuesta a mi propia pregunta: He utilizado instrumentos para eliminar sistemáticamente todas las pérdidas de memoria en mi aplicación. Una vez que había hecho eso, el problema desapareció.

Otros consejos

Yo tenía el mismo problema que tú, he resuelto por la fuerza mediante programación temporal girar mi presentando viewController (una vez regresado a ella), en su método viewDidAppear a cierta rotación arbitraria. Por supuesto, sin animación. Y luego girar de nuevo a la orientación deseada (la que he salvado de antes de la rotación).

Así que si muestra VC1 VC2 de forma modal, y gira el usuario VC2 puedo configurar la orientación de VC1 de acuerdo con la orientación actual de vc2 llamando a: UIInterfaceOrientation currentOrientation = self.interfaceOrientation; // tienda orientación actual de VC2 (vista modal) [Vc1 willRotateToInterfaceOrientation: duración currentOrientation: 0];

Entonces vc2 dissmiss y en viewWillAppear de VC1 hago esto:

- (void) viewDidAppear: (BOOL) animada {

[super viewDidAppear:animated];

/* Store wanted orientation */
UIInterfaceOrientation currentOrientation = self.interfaceOrientation; 

/* rotate to some arbitrary orientation, this solves the bug. */
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortraitUpsideDown animated:NO]; 

[[UIDevice currentDevice] setOrientation:currentOrientation animated:NO]; //restore wanted orientation.

}

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