Leí SO sobre otro usuario que encontró un error similar , pero este error es en un caso diferente.
Recibí este mensaje cuando agregué un controlador de vista inicialmente:
Unbalanced calls to begin/end appearance transitions for
<UITabBarController: 0x197870>
La estructura de la aplicación es la siguiente:
Tengo un TabBarController de 5 pestañas vinculado a 5 View Controllers. En la pestaña de visualización inicial, llamo un nuevo controlador de vista para superponer como una introducción de la aplicación.
Utilizo este código para llamar al controlador de vista de introducción:
IntroVC *vc = [[IntroVC alloc] init];
[self presentModalViewController:vc animated:YES];
[vc release];
Después de que IntroVC
aparezca este controlador de vista, se mostrará el error anterior.
ps Estoy usando xCode 4.2 y iOS 5.0 SDK, desarrollando la aplicación iOS 4.3.
ios
ios4
uitabbarcontroller
Raptor
fuente
fuente
Respuestas:
Sin ver más del código circundante, no puedo dar una respuesta definitiva, pero tengo dos teorías.
No está utilizando
UIViewController
el inicializador designadoinitWithNibName:bundle:
. Intente usarlo en lugar de soloinit
.Además,
self
puede ser uno de los controladores de vista del controlador de la barra de pestañas. Presente siempre los controladores de vista desde el controlador de vista superior, lo que significa que en este caso pida al controlador de la barra de pestañas que presente el controlador de vista de superposición en nombre del controlador de vista. Aún puede mantener los delegados de devolución de llamada en el controlador de vista real, pero debe tener el controlador de la barra de pestañas presente y descartarlo.fuente
Solucioné este error cambiando la animación de SÍ a NO.
De:
A:
fuente
Según lo publicado por danh
Puede generar esta advertencia presentando el vc modal antes de que la aplicación se haya inicializado. es decir, inicie una aplicación de plantilla de aplicación con pestañas y presente un vc modal sobre self.tabBarController como última línea en la aplicación: didFinishLaunching. Aparece una advertencia. Solución: deje que la pila se desenrolle primero, presente el vc modal en otro método, invocado con un performSelector withDelay: 0.0
Intente mover el método a viewWillAppear y guárdelo para que se ejecute solo una vez (recomendaría configurar una propiedad)
fuente
viewWillAppear
y noviewDidAppear
?Otra solución para muchos casos es asegurarse de que la transición entre
UIViewController
s ocurra después de que finalice el procedimiento no adecuado (como durante la inicialización), haciendo lo siguiente:Esto es general para también
pushViewController:animated:
, etc.fuente
Yo tuve el mismo problema. Llamé a un método
viewDidLoad
dentro de mi primeraUIViewController
Dentro del segundo
UIViewController
hice lo mismo también con 0,5 segundos de retraso. Después de cambiar el retraso a un valor más alto, funcionó bien. Es como si la transición no se pudiera realizar demasiado rápido después de otra transición.fuente
viewDidAppear
para queUINavigationController
esté listo para manejarlo. Cambié mi publicación a esta;)Tuve el mismo problema cuando necesito presentar mi controlador de vista de inicio de sesión desde otro controlador de vista. Si el usuario no está autorizado, lo hice en el método ViewDidLoad de mi otro controlador de vista (si no está autorizado -> presentModalViewController). Cuando empiezo a hacerlo en el método ViewDidAppear, resolví este problema. ¡Creo que ViewDidLoad solo inicializa propiedades y luego comienza el algoritmo de visualización de visualización real! ¡Es por eso que debe usar el método viewDidAppear para hacer transiciones modales!
fuente
Tuve este problema debido a un error tipográfico:
en vez de
Estaba llamando "WillAppear" en el super en lugar de "DidAppear"
fuente
Tuve muchos problemas con el mismo problema. Resolví este por
Intro *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"introVC"];
[self.tabBarController presentModalViewController : vc animated:YES];
Tengo el controlador de vista en mi guión gráfico, por alguna razón, usar solo
[[introvc alloc] init];
no funcionó para mí.fuente
Lo resolví escribiendo
fuente
Tuve este problema con un código de terceros. Alguien olvidó configurar el superdentro de viewWillAppear y viewWillDisappear en una clase TabBarController personalizada.
fuente
Si está usando
transitioningDelegate
(no es el caso en el ejemplo de esta pregunta), configure tambiénmodalPresentationStyle
en.Custom
.Rápido
fuente
Yo tenía el mismo error. Tengo una barra de pestañas con 3 elementos e inconscientemente estaba tratando de llamar al controlador de vista raíz del elemento 1 en el elemento 2 de mi barra de pestañas usando
performSegueWithIdentifier
.Lo que sucede es que llama al controlador de vista y vuelve al controlador de vista raíz del elemento 2 después de unos segundos y registra ese error.
Aparentemente, no puede llamar al controlador de vista raíz de un elemento a otro elemento.
Entonces en lugar de
performSegueWithIdentifier
solía
[self.parentViewController.tabBarController setSelectedIndex:0];
Espero que esto ayude a alguien.
fuente
Tuve el mismo problema y pensé en publicar en caso de que alguien más se encuentre con algo similar.
En mi caso, había adjuntado un reconocedor de gestos de pulsación prolongada a mi UITableViewController.
En mi selector onLongPress, lancé mi siguiente controlador de vista.
En mi caso, recibí el mensaje de error porque el reconocedor de pulsación larga se disparó más de una vez y, como resultado, mi "SomeViewController" se insertó en la pila varias veces.
La solución fue agregar un booleano para indicar cuándo se había insertado SomeViewController en la pila. Cuando se llamó al método viewWillAppear de mi UITableViewController, volví a establecer el booleano en NO.
fuente
Descubrí que, si está utilizando un guión gráfico, querrá poner el código que presenta el nuevo controlador de vista en viewDidAppear. También eliminará la advertencia "No se recomienda presentar controladores de vista en controladores de vista separados".
fuente
En Swift 2+ para mí funciona:
Tengo UITabBarViewController en el guión gráfico y tenía la propiedad selectedIndex como esta:
Pero lo elimino y agrego mi método viewDidLoad de mi clase inicial, así:
Espero poder ayudar a alguien.
fuente
En realidad, debe esperar hasta que finalice la animación de inserción. De modo que puede delegar UINavigationController y evitar presionar hasta que finalice la animación.
fuente
Como sugirió @danh, mi problema fue que estaba presentando el modal vc antes de que
UITabBarController
estuviera listo. Sin embargo, me sentí incómodo al depender de un retraso fijo antes de presentar el controlador de vista (según mis pruebas, necesitaba usar un retraso de 0.05-0.1 sperformSelector:withDelay:
). Mi solución es añadir un bloque que es llamada enUITabBarController
'sviewDidAppear:
método:PRTabBarController.h:
PRTabBarController.m:
Ahora en
application:didFinishLaunchingWithOptions:
fuente
necesita asegurarse de que - (void) beginAppearanceTransition: (BOOL) isAppearing animado: (BOOL) animado y - (void) endAppearanceTransition se crean juntos en la clase.
fuente
Tuve el mismo problema. Al desarrollar quería evitar las pantallas. Estaba navegando de un controlador de vista a otro en viewDidLoad llamando a un método selector.
El problema es que debemos dejar que ViewController finalice la transición antes de pasar a otro ViewController.
fuente
Rápido 5
fuente
Tuve este problema cuando navegué desde la raíz TVC a TVC A y luego a TVC B. Después de tocar el botón "cargar" en TVC BI, quería volver directamente a la raíz TVC (no es necesario volver a visitar TVC A, entonces, ¿por qué hacerlo) . Yo tenía:
... que dio el error "Llamadas no balanceadas para comenzar / finalizar, etc.". Lo siguiente solucionó el error, pero no la animación:
Esta fue mi solución final, sin error y aún animada:
fuente
Encontré este error cuando conecté un UIButton a una acción de segue del guión gráfico (en IB) pero luego decidí hacer que el botón llamara programáticamente
performSegueWithIdentifier
olvidándose de eliminar el primero de IB.En esencia, realizó la llamada de segue dos veces, dio este error y, de hecho, presionó mi vista dos veces. La solución fue eliminar una de las llamadas segue.
¡Espero que esto ayude a alguien tan cansado como yo!
fuente