Continúa recibiendo "Llamadas desequilibradas para comenzar / terminar las transiciones de apariencia para el error <ViewController>"

Tengo una aplicación que casi funciona a la perfección. Así es como mi aplicación está estructurada:

6 Controles de vista total en el guión gráfico. Los primeros 3 View Controllers son los más importantes. El controller de vista inicial tiene botones para "Iniciar session" y "Registrarse". El button "Login" presenta un controller de vista de inicio de session y el button "Signup" presenta un controller de vista de inicio de session.

El controller de logging de logging tiene 3 campos para nombre de usuario, contraseña y correo electrónico y luego un button "enviar". El button enviar envía los datos a mi server web y si todo se envía correctamente, llamará al método "performSegueWithIdentifier" por sí mismo.

Aquí está la statement:

[self performSegueWithIdentifier:@"superSegue" sender:self]; 

Pasé 2 horas esta noche intentando que la llamada de método anterior funcione y finalmente funciona. Para que funcione, tuve que seleccionar mi Controlador de vista de logging en el guión gráfico y acceder a Editor> Incrustar> Controlador de navigation (si no recuerdo mal, tuve que hacer esto porque el controller de vista de logging se presenta de manera modal). Luego arrastré desde el button de envío de Signup View Controller al View Controller al que quiero presionar Push y seleccioné y luego escribí un nombre de identificador.

De todos modos, todo lo anterior funciona perfectamente bien hasta que bash usar el button de retroceso en el controller de vista que empujamos a utilizar la llamada de método. Si toco el button de retroceso, va a una pantalla negra del 90% con una barra de navigation en blanco en la parte superior con un button de retroceso y, por supuesto, ese button de retroceso no funciona tan bien.

Este es el error que obtengo en la console:

 Unbalanced calls to begin/end appearance transitions for <VerificationViewController: 0x14ed1bb0> 

El Controlador de Verificación es el Controlador de Vista que el Controlador de Vista de logging presiona mediante el método performSegueWithIdentifier.

¿Alguien sabe cómo puedo solucionar este error?

He incluido una captura de pantalla a continuación de cómo se ve mi storyboard en xcode. Hay un controller de vista que he codificado, pero que todavía no está conectado, y que no debería hacer ninguna diferencia, de modo que puede ignorar el controller de vista a la derecha del VC de inicio de session.

introduzca la descripción de la imagen aquí

Encontré la respuesta esta mañana en otra pregunta sobre stackoverflow. La respuesta se puede encontrar aquí .

Cuando configuré originalmente el Push Segue, presioné y arrastré desde un button y también llamé al método performSegueWIthIdentifier dentro de la implementación del método IBAction de ese button. Esto estaba causando 2 segues de empuje idénticos para ejecutarse en el button presionar. Acabo de dejar mi llamada de método en el IBAction, he eliminado el antiguo segue de inserción y he creado un nuevo segue de empuje solo esta vez que he hecho clic y he arrastrado desde el View Controller completo en lugar del button.

Resolví este problema envolviéndolo.

 dispatch_async(dispatch_get_main_queue()) { //call your performSegueWithIdentifier in here } 

En mi caso, era una subclass de UITabBarController con un setSelectedIndex: sobrecargado setSelectedIndex: método que hace la transición con una animation. Descubrí que se debe llamar a la siguiente antes de comenzar la animation:

 [sourceVC viewWillDisappear:YES]; [destinationVC viewWillAppear:YES]; 

Y lo siguiente en el bloque de finalización:

 if (finished) { [sourceVC viewDidDisappear:YES]; [destinationVC viewDidAppear:YES]; [super setSelectedIndex:selectedIndex]; } 

El problema aún puede ocurrir si se producen múltiples cambios de índice seleccionado antes de que finalicen las animaciones.

Motivo del error : este post se muestra si está presionando / presentando otro controller de vista del método viewWillAppear, loadView, init o viewDidLoad del controller de vista actual

Solución : Mueva su código presionando / presentando para ver el método DidAppear para resolver el problema.

La razón es: en viewDidLoad no todas las animaciones de lujo ya se han terminado, mientras que en viewDidAppear todo está hecho.

En mi caso, esta advertencia fue causada por llamar a popToRootViewController del UINavigationController mientras se mostraba la vista modal. Cuando moví popToRootViewController después de que se descartara la vista modal, la advertencia paró para aparecer.

Lo trabajé y es bueno para mí Motivo por error: este post se muestra si está presionando / presentando otro controller de vista desde TabBarController, Solución: configure viewController.modalPresentationStyle = .overCurrentContext , luego presente viewController topViewController.present(vc, animated: true, completion: nil)