“¿La aplicación intentó presentar modalmente un controlador activo”?

100

Me acabo de encontrar con un bloqueo que muestra un NSInvalidArgumentExceptionmensaje con este mensaje en una aplicación que no estaba haciendo esto antes.

La aplicación intentó presentar modalmente un controlador activo UITabBarController: 0x83d7f00.

Tengo un UITabBarControllerque creo en el AppDelegatey le doy la matriz de UIViewControllers.

Uno de ellos quiero presentarlo de manera modal cuando se haga tapping en él. Lo hice implementando el método delegado

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController

Si ese controlador de vista es de la clase del que quiero presentar modalmente, devuelvo NO y hago

[tabBarController presentModalViewController:viewController animated:YES];

Y ahora recibo ese error, lo que parece significar que no puede presentar modalmente un controlador de vista que está activo en otro lugar (en la barra de pestañas ...) Debería decir que estoy en XCode 4.2 Developer Preview 7, así que esto es iOS 5 (sé sobre el NDA, pero creo que no estoy dando ningún detalle prohibido). Actualmente no tengo una instalación de XCode para probar si esto falla al compilar contra el SDK de iOS4, pero estoy casi completamente seguro de que no es así.

Solo quería preguntar si alguien ha experimentado este problema o tiene alguna sugerencia.

Javier Soto
fuente
Antes de iOS 5, esto no generó una excepción, pero no devolvió nada. A partir de iOS 5, este comando genera una excepción.
Frédéric Adda

Respuestas:

103

Suponga que tiene tres controladores de vista instanciados así:

UIViewController* vc1 = [[UIViewController alloc] init];
UIViewController* vc2 = [[UIViewController alloc] init];
UIViewController* vc3 = [[UIViewController alloc] init];

Los ha agregado a una barra de pestañas como esta:

UITabBarController* tabBarController = [[UITabBarController alloc] init];
[tabBarController setViewControllers:[NSArray arrayWithObjects:vc1, vc2, vc3, nil]];

Ahora estás intentando hacer algo como esto:

[tabBarController presentModalViewController:vc3];

Esto le dará un error porque el controlador de la barra de pestañas tiene un control mortal en el controlador de vista que le dio. No puede agregarlo a la matriz de controladores de vista en la barra de pestañas o no puede presentarlo de manera modal.

Apple espera que trates sus elementos de interfaz de usuario de cierta manera. Esto probablemente esté enterrado en alguna parte de las Directrices de interfaz humana como un "no hagas esto porque no esperamos que quieras hacer esto".

lswank
fuente
6
El caso es que esto no fue ningún problema antes de iOS 5, ¡de ahí mi preocupación! Lo que hice fue agregar un UIViewController ficticio a la barra de pestañas y presentar modalmente la instancia de subclase del controlador de vista real.
Javier Soto
1
@Iswank, ahora en iOS 6, para hacer las cosas "más fáciles", desaprobaron presentModalViewController causando todo tipo de problemas de rotación ... necesita usar presentViewController: animated: complete y verifique cómo su aplicación está manejando los cambios
whyoz
15

Tengo el mismo problema. Intento presentar el controlador de vista justo después de descartarlo.

[self dismissModalViewControllerAnimated:YES];

Cuando trato de hacerlo sin animación, funciona perfectamente, por lo que el problema es que el controlador todavía está vivo. Creo que la mejor solución es usar dismissViewControllerAnimated:completion:para iOS5

Danil
fuente
Falla si lo descarta animado porque cuando quiera presentar el controlador de vista modal nuevamente, todavía está modalmente en la pantalla, siendo animado.
Pascal
2
Está depricado en IOS 6.0
Sumit Kumar Saha
12

En mi caso, estaba intentando presentar el viewController (tengo la referencia del viewController en el TabBarViewController) desde diferentes controladores de vista y fallaba con el mensaje anterior. En ese caso, para evitar la presentación, puede utilizar

viewController.isBeingPresented

!viewController.isBeingPresented {
          // Present your ViewController only if its not present to the user currently.
}

Podría ayudar a alguien.

Karthick Ramesh
fuente
funciona solo en viewWillappperar, pero cuando lo verifico antes de presentar viewController que ya se presenta, siempre devuelve falso.
gurú
1
No funciona para mi. Aún se bloquea la aplicación. (! viewController.presentingViewController) problema resuelto.
Argus
3

Tuve el mismo problema. Lo soluciono. Puedes probar este código:

[tabBarController setSelectedIndex:1];
[self dismissModalViewControllerAnimated:YES];
Erhan Demirci
fuente
2

Me sucedió el mismo error de problema cuando intenté con presentun controlador de vista secundario en lugar de su UINavigationViewControllerprincipal

Nik
fuente
0

Solo quitar

[tabBarController presentModalViewController:viewController animated:YES];

y mantener

[self dismissModalViewControllerAnimated:YES];
usuario170317
fuente
esto da una advertencia obsoleta ... entonces, ¿cuál es la alternativa de esto?
Kirtikumar A.
Aquí utilicé [blockSelf dispatsViewControllerAnimated: YES completado: nil];
Kirtikumar A.
0

En lugar de usar:

self.present(viewControllerToPresent: UIViewController, animated: Bool, completion: (() -> Void)?)

puedes usar:

self.navigationController?.pushViewController(viewController: UIViewController, animated: Bool)
Wimukthi Rajapaksha
fuente
0

En mi caso, estaba presentando el rootViewControllerde un UINavigationControllercuando se suponía que debía presentar el UINavigationControllersí mismo.

Laura Corssac
fuente