Llamadas no balanceadas para comenzar / finalizar transiciones de apariencia para <FirstViewController: 0x2a2c00>

93

Tengo este problema cuando simulo mi aplicación, no es un error ni una advertencia, pero aparece en mi consola, ¿alguien ha experimentado esto antes?

C.Johns
fuente
¿Haces algún tipo de animación en ese controlador de vista?
1
Si. Tengo una animación de apertura que se desliza en imágenes separadas, ahora he notado que este error solo ocurre cuando estoy cargando código en el teléfono.
C.Johns
el mensaje de error sugiere que comiences una transición pero falta una llamada al método de finalización correspondiente.
1
Tengo lo mismo. ¿Alguna solución para esto?
seeafish
También en busca de una resolución para esto
barfoon

Respuestas:

48

En mi caso, este error ocurre cuando hace clic en dos pestañas en una vista de tabla muy rápido.

El resultado causa un nombre de título incorrecto, el botón de retroceso desaparece. Alguien mencionó que cuando presionas una vista set animated:NO,. El error desaparecerá pero seguirá provocando un comportamiento extraño. Empuja dos vistas, luego debe retroceder dos veces para volver a la pantalla de vista de tabla.

Método que probé para resolver este problema:

añadir BOOL cellSelected;

en viewWillAppear cellSelected = YES;

en el delegado de didselectcell if (cellSelected){cellSelected = NO; do action ; }

Esto ayuda a evitar hacer clic muy rápido en dos celdas diferentes.

chings228
fuente
5
Supongo que parte de la redacción fue difícil de entender. Hice algunas ediciones para aumentar la legibilidad.
Kyle Clegg
42

En mi caso sucedió cuando disparé [self performSegueWithIdentifier:@"SomeIdentifier" sender:self]; dentro UINavigationControllerdel viewDidLoadmétodo de un elemento .

Moverlo al viewDidAppearmétodo resolvió el problema.

La razón muy probable es que viewDidLoadno todas las animaciones de fantasía ya se han terminado, mientras que en viewDidAppeartodo está hecho.

tttthomasssss
fuente
Gracias. Me había perdido en la era de los hombres de las cavernas donde estaba creando cada elemento de la interfaz de usuario a través del código. Las cosas del guión gráfico son nuevas para mí.
Kiran Kulkarni
21

Tengo este problema también. Encontré dos soluciones a este problema:

  1. Puedes ver esta solución arriba.
  2. Encontré una subclase desde UINavigationControllerdonde se resolvió este problema. Controlador de navegación con búfer
Igor_CodabraSoft
fuente
15

Debe ejecutar su código en un bucle diferente para evitar esto

 double delayInSeconds = 0.1;
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            // Put your code here
[self presentViewController:self.yourModalVC animated:YES completion:nil];
        });
prohuutuan
fuente
7
Una mejor idea es encerrar la animación de presentación dentro de una dispatch_asynccola principal. Lo que pasa dispatch_asynces que espera hasta que todas las demás animaciones de la cola principal estén listas. es mucho mejor que usar un retraso porque: 1- nunca sabrás si un retraso es suficiente, depende de tu dispositivo anfitrión 2- terminarás exagerando el retraso y algo se retrasará. prueba esto:dispatch_async(dispatch_get_main_queue(), ^{[self presentViewController:self.yourModalVC animated:YES completion:nil];});
M. Porooshani
12

Tuve muchos problemas con el mismo problema. Resolví esto de esta manera

1) No está utilizando el UIViewController'sinicializador designado initWithNibName:bundle:. Intente usarlo en lugar de solo init.

2) establecido animated:YESen NO, y eso resolvió el problema. p.ej.[self.navigationController pushViewController: viewController_Obj animated:NO];

kunalg
fuente
7

Tuve el mismo problema al usar el controlador de navegación y presionar otros controladores hacia él. Intenté usar el controlador de navegación con búfer y varios otros enfoques, pero no funcionó para mí. Después de pasar un tiempo para resolverlo, noté que este problema ocurre si intenta presionar un nuevo controlador de vista mientras la transacción anterior (animación) está en progreso (aproximadamente 0.5 segundos de duración, supongo). De todos modos, hice una solución rápida al delegar el controlador de navegación y esperar a que finalizara la animación anterior.

dimanitm
fuente
¡Gracias! Mover mi lógica a viewDidAppear ayudó en mi situación.
Jaroslav
7

Asegúrese de no olvidar en -viewWillAppear, -viewDidAppear, -viewDidLoad, -viewWillDisappear, -viewDidDisappear para llamar al método super adecuado en su sobrecarga de esos métodos. Por ejemplo, en mi caso, el nombre del método no coincide de esta manera:

-(void)viewDidAppear
{
 [super viewDidDisappear];
 //some code staff
 ..
}

observe que los métodos de aparecer y desaparecer no coinciden

Nikolay Shubenkov
fuente
Solo pasé unas dos horas depurando este problema y resultó ser así. Llamando super.viewWillAppear()dentro viewDidDisappear().
Daniel Wood
Gracias por este consejo. No fue mi único problema, ¡pero ayudó!
Anthony C
4

'Llamadas no balanceadas para comenzar / finalizar transiciones de apariencia para'

Dice que una animación se inicia antes de que no se complete la última animación relacionada. Entonces, ¿está abriendo algún controlador de vista antes de presionar el nuevo? ¿O puede estar saliendo a la raíz? Si es así, intente hacerlo sin animación, es decir[self.navigationController popToRootViewControllerAnimated:NO];

Y vea si esto resuelve el problema, en mi caso esto funcionó.

Bucle infinito
fuente
1
Esta es la clave: pop o cambiar otras transiciones del controlador de vista al mismo tiempo.
Rocky
2

Recibí este problema porque estaba llamando a un UIPrintInteractionController desde un viewController sin UITabbar, y ni UINavigationBar. Parece que UIPrintInteractionController no obtuvo el printInteractionControllerParentViewController correcto. Implementar el método en el delegado y devolver el rootViewController actual funcionó para mí.

    - (UIViewController*)printInteractionControllerParentViewController:(UIPrintInteractionController*)printInteractionController;
balooka
fuente
2

Tuve un problema similar que implicaba rebobinar los diálogos modales. Publicado la solución aquí ...

https://stackoverflow.com/a/38795258/324479

[Problema]

Controlador de navegación -> VC1 -Push -> VC2 -PopOver o Modal Segue -> VC3.

VC3 está volviendo a VC1.

Cuando la Segue de VC2 a VC3 es PopOver y Modal, la desconexión finaliza en una advertencia: Llamadas no balanceadas para comenzar / finalizar transiciones de apariencia para UIViewController "

Si se empuja Segue de VC a VC, la advertencia desaparece.

[Solución]

Sería genial si la lógica de relajación se encargara de esto. Quizás sea un error, quizás no. De cualquier manera, la solución es hacer que VC2 (el controlador que tiene la ventana emergente) sea el objetivo del rebobinado, luego esperar a que termine de aparecer antes de que aparezca el controlador de navegación. Eso asegura que la animación de rebobinado (ventana emergente inversa) tenga tiempo suficiente para terminar antes de retroceder más. Incluso con las animaciones apagadas, todavía tiene que esperar o, de lo contrario, obtendrá el error.

Su código para VC2 debería ser el siguiente. (Rápido)

class VC2: UIViewController {
    private var unwind = false
    @IBAction func unwindToVC1(segue:UIStoryboardSegue) {
        unwind = true
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

        if unwind {
            self.navigationController?.popViewControllerAnimated(false)
        }
    }
}
Carter Medlin
fuente
1

La situación puede ocurrir si está agregando una vista con un controlador de vista modal como una subvista. Mejor usar:

-(void) viewDidAppear:(BOOL)animated {
    [self presentViewController:self.yourModalVC animated:YES completion:nil];
}

Básicamente, está diciendo que el ciclo de vida de la vista no está optimizado para los viewControllers que está tratando de mostrar en ese momento.

Elliotrock
fuente
1

Tengo un problema similar al intentar hacer:

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:2] animated:YES];

en una función como - (void) popUpToLevelTwo;, y poner un return;al final de la función resuelve el problema

BabyPanda
fuente
1

También tengo esto en

[self dismissModalViewControllerAnimated:YES];

Cambié el YESa a NO, y eso resolvió el problema.

DD.amor
fuente
1

Tengo el mismo problema cuando utilicé el método pop de navigationcontroller En mi aplicación, uso una lógica separada para el controlador de navegación, así que evité el uso de la barra de navegación y siempre está oculta. Luego utilizo una vista personalizada y una notificación para manejar el botón trasero y sus eventos. los observadores de notificaciones se registran y no se eliminan. Entonces, la notificación se dispara dos veces y crea el error mencionado anteriormente. Verifique su código a fondo para obtener tales fallas

Dileep Stanley
fuente
1

Por lo que vale, obtuve este mismo error al no incluir una llamada a [super viewDidLoad:animated]en mi viewDidLoadanulación.

raeldor
fuente
1
quizás te refieres a viewDidAppear? viewDidLoad no tiene parámetros
Fabio Napodano
1

También tuve este problema cuando presioné un botón de un NIB. Resulta que accidentalmente conecté el botón para enviar un evento a dos métodos IBAction, cada uno de los cuales hizo un pushViewController: animated:

Martin Lockett
fuente
Gracias !! me ahorras el tiempo !!
VD
1

Implementé alguna lógica para esperar presionando UIViewControllerhasta que se descargaran todos los datos. Hubo un error en esta lógica que hizo que se empujara elUIViewController demasiado pronto mientras aún había otra llamada a la API en curso.

Hizo que el mismo UIViewControllerfuera empujado dos veces por el UINavigationControllery dio esta advertencia.

Jaspe
fuente
1

Razón por mensaje: Este mensaje a ser visualizado, si y sólo si usted está empujando / presentar otro controlador Vista desde viewWillAppear, loadView, inito viewDidLoadel método de la corriente Vista Controlador

Manera de eliminar el mensaje de error: mover su código de presentación / presentación al viewDidAppearmétodo resolverá el problema

Mehul Thakkar
fuente
1

Rápido 4

Mi problema era que estaba presentando otro VC antes de que el actual terminara de renderizarse.

La solución fue presentar mi nextVC después de un breve retraso.

LO QUE NO DEBE HACER

override func viewDidLoad() {
    super.viewDidLoad() 
    self.present(MyNextVC(), animated: true, completion: nil)
}

LO QUE DEBE HACER

override func viewDidLoad() {
    super.viewDidLoad() 
    //Wait until the view finished to be constructed
    perform(#selector(showMyNextVC), with: nil, afterDelay: 0.01)
}

@objc func showCityList() {
    self.present(MyNextVC(), animated: true, completion: nil)
}
Ugo Marinelli
fuente
1
En lugar de usar un retraso, pondría el código en viewDidAppear o viewDidLayoutSubviews.
Pranav Kasetti
0

Tuve este problema cuando me olvidé de configurar Break; después de presionar la vista en una declaración de cambio!

Como aquí:

case 1:{

        SomeViewController *someViewController = [[SomeViewController alloc]initWithNibName:@"SomeViewController" bundle:Nil];
        [self.navigationController pushViewController:someViewController animated:YES];
        [someViewController release];
    }

        break; //Forgetting to set break here:
Alex McPherson
fuente
0

la razón detrás del error "Llamadas no balanceadas para comenzar / finalizar transiciones de apariencia" es cuando navega | segue dos veces al mismo tiempo

poa
fuente
0

una solución sería,

[NSTimer scheduledTimerWithTimeInterval:0.05(or as required) target:self
selector:@selector(your_selector_method_to_push_the_view) userInfo:nil repeats:NO];
usuario3390994
fuente
0

Puede encontrarse con esto si intenta descartar un UIViewController antes de que termine de cargarse.

Tenía este mensaje en la consola y me estaba enfocando completamente en el UIViewController que presentaba el nuevo UIViewController, sin éxito. Finalmente descubrí que el problema estaba en el UIViewController que estaba presentando y se estaba descartando porque el usuario no había iniciado sesión en su cuenta.

Espero que esto ayude a alguien.

Mark Hennings
fuente
0

Este fue difícil para mí: he anulado

override func shouldAutomaticallyForwardRotationMethods() -> Bool {
    return true
}

sin anular:

override func shouldAutomaticallyForwardAppearanceMethods() -> Bool {
    return true
}

en mi controlador de navegación raíz de ventana. luego, un controlador de navegación para niños se quejó al presionar otro controlador de vista con la advertencia mencionada anteriormente. La advertencia no fue la peor, el gran problema fue que allí ya no se llamaba al delegado del controlador de navegación infantil. cansado.

heiko
fuente
0

En mi caso me retracto NSDatadesde NSURLdentro ' viewDidLoadmétodo'.

BhushanVU
fuente