tab item bar ios ios4 uitabbarcontroller

item - tabbar ios



Llamadas no balanceadas para comenzar/finalizar transiciones de apariciĆ³n para<UITabBarController: 0x197870> (20)

Como @danh sugirió, mi problema era que estaba presentando el vc modal antes de que UITabBarController estuviera listo. Sin embargo, me sentí incómodo confiando en un retraso fijo antes de presentar el controlador de vista (de mi prueba, necesitaba usar un retraso de performSelector:withDelay: en performSelector:withDelay: . Mi solución es agregar un bloque al que se llama en el UITabBarController de viewDidAppear: :

PRTabBarController.h:

@interface PRTabBarController : UITabBarController @property (nonatomic, copy) void (^viewDidAppearBlock)(BOOL animated); @end

PRTabBarController.m:

#import "PRTabBarController.h" @implementation PRTabBarController - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; if (self.viewDidAppearBlock) { self.viewDidAppearBlock(animated); } } @end

Ahora en la application:didFinishLaunchingWithOptions:

PRTabBarController *tabBarController = [[PRTabBarController alloc] init]; // UIWindow initialization, etc. __weak typeof(tabBarController) weakTabBarController = tabBarController; tabBarController.viewDidAppearBlock = ^(BOOL animated) { MyViewController *viewController = [MyViewController new]; viewController.modalPresentationStyle = UIModalPresentationOverFullScreen; UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; [weakTabBarController.tabBarController presentViewController:navigationController animated:NO completion:nil]; weakTabBarController.viewDidAppearBlock = nil; };

Leí SO sobre otro usuario que encontró un error similar, pero este error es 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 Controladores de vista. En la pestaña de visualización inicial, invoco un nuevo controlador de visualización para superponerlo como una introducción de la aplicación.

Uso 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 este controlador de vista IntroVC , se muestra el error anterior.

ps Estoy usando xCode 4.2 y iOS 5.0 SDK, desarrollando la aplicación iOS 4.3.


De hecho, debes esperar hasta que termine la animación de inserción. Así que puedes delegar UINavigationController y evitar empujar hasta que termine la animación.

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated{ waitNavigation = NO; } -(void)showGScreen:(id)gvc{ if (!waitNavigation) { waitNavigation = YES; [_nav popToRootViewControllerAnimated:NO]; [_nav pushViewController:gvc animated:YES]; } }


Descubrí que, si está usando un guión gráfico, querrá poner el código que presenta el nuevo controlador de vista en viewDidAppear. También eliminará la advertencia "Presentar controladores de vista en controladores de vista desacoplados".


En Swift 2+ para mí funciona:

Tengo UITabBarViewController en el guión gráfico y he seleccionado la propiedad index como esta:

Pero lo elimino y agrego mi método viewDidLoad de mi clase inicial, así:

override func viewDidLoad() { super.viewDidLoad() self.tabBarController?.selectedIndex = 2 }

Espero poder ayudar a alguien


Lo resolví escribiendo

[self.navigationController presentViewController:viewController animated:TRUE completion:NULL];


Me encontré con este error cuando enganché un UIButton a una acción segue del guión gráfico (en IB) pero luego decidí que el botón programáticamente llama a performSegueWithIdentifier olvidándome de eliminar el primero de IB.

En esencia, realizó la llamada segue dos veces, dio este error y en realidad empujó mi vista dos veces. La solución fue eliminar una de las llamadas segue.

Espero que esto ayude a alguien tan cansado como yo!


Otra solución para muchos casos es asegurarse de que la transición entre UIViewController ocurra después de que finalice el procedimiento no adecuado (como durante la inicialización), al hacer lo siguiente:

__weak MyViewController *weakSelf = self; dispatch_async(dispatch_get_main_queue(), ^{ [weakSelf presentViewController:vc animated:YES]; });

Esto es general también para pushViewController:animated: etc.


Según publicado por danh

Puede generar esta advertencia presentando el vc modal antes de que la aplicación termine de inicializarse. es decir, inicie una aplicación de plantilla de aplicación con pestañas y presente una vc modal encima de self.tabBarController como la última línea en la aplicación: didFinishLaunching. Advertencia aparece. Solución: deje que la pila se desenrolle primero, presente la vc modal en otro método, invocado con un performSelector withDelay: 0.0

Intenta mover el método en la vista Mostrar y guardarlo para que se ejecute solo una vez (se recomienda configurar una propiedad)


Si está utilizando transitioningDelegate (no es el caso en el ejemplo de esta pregunta), también configure modalPresentationStyle en .Custom .

Rápido

let vc = storyboard.instantiateViewControllerWithIdentifier("...") vc.transitioningDelegate = self vc.modalPresentationStyle = .Custom


Sin ver más del código circundante, no puedo dar una respuesta definitiva, pero tengo dos teorías.

  1. No está utilizando el inicializador designado de initWithNibName:bundle: Intenta usarlo en lugar de solo init .

  2. Además, self puede ser uno de los controladores de vista del controlador de la barra de pestañas. Siempre presente los controladores de vista desde el controlador de vista superior, lo que significa que en este caso solicite al controlador de barra de pestañas que presente el controlador de vista de superposición en nombre del controlador de vista. Todavía puede mantener delegados de devolución de llamada en el controlador de vista real, pero debe tener el controlador de barra de pestañas presente y descartar.


Solucioné este error cambiando el modo animado de SÍ a NO.

De:

[tabBarController presentModalViewController:viewController animated:YES];

A:

[tabBarController presentModalViewController:viewController animated:NO];


Tuve el mismo problema cuando necesito presentar mi controlador de vista de inicio de sesión desde otro controlador de visualización. Si el usuario no está autorizado, lo hice en el método ViewDidLoad de mi controlador de otra vista (si no está autorizado -> presentModalViewController). Cuando comienzo a hacerlo en el método ViewDidAppear, resolví este problema. ¡Creo que ViewDidLoad solo inicializa las propiedades y luego comienza el algoritmo de visualización de vista real! ¡Es por eso que debes usar el método viewDidAppear para hacer transiciones modales!


Tuve el mismo problema y pensé que publicaría en caso de que alguien más se encuentre con algo similar.

En mi caso, adjunté un extensor de reconocimiento de gestos de prensa a mi UITableViewController.

UILongPressGestureRecognizer *longPressGesture = [[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onLongPress:)] autorelease]; [longPressGesture setMinimumPressDuration:1]; [self.tableView addGestureRecognizer:longPressGesture];

En mi selector onLongPress, lancé mi siguiente controlador de vista.

- (IBAction)onLongPress:(id)sender { SomeViewController* page = [[SomeViewController alloc] initWithNibName:@"SomeViewController" bundle:nil]; [self.navigationController pushViewController:page animated:YES]; [page release]; }

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 valor booleano para indicar cuándo SomeViewController se había insertado en la pila. Cuando se invocó el método viewWillAppear de mi UITableView Controller, configuré boolean nuevamente en NO.


Tuve este problema con un código de un tercero. Alguien olvidó configurar el super dentro de viewWillAppear y viewWillDisappear en una clase personalizada de TabBarController.

- (void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // code... } or - (void) viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; // code... }


Tuve este problema cuando había navegado desde root TVC a TVC A y luego a TVC B. Después de tocar el botón "cargar" en TVC BI quería volver directamente al TVC raíz (no es necesario volver a TVC A, ¿por qué hacerlo?) . Tuve:

//Pop child from the nav controller [self.navigationController popViewControllerAnimated:YES]; //Pop self to return to root [self.navigationController popViewControllerAnimated:YES];

... que emitió el error "Llamadas no balanceadas para comenzar / finalizar, etc.". Lo siguiente corrigió el error, pero no la animación:

//Pop child from the nav controller [self.navigationController popViewControllerAnimated:NO]; //Then pop self to return to root [self.navigationController popViewControllerAnimated:NO];

Esta fue mi solución final, sin errores y aún animada:

//Pop child from the nav controller [self.navigationController popViewControllerAnimated:NO]; //Then pop self to return to root, only works if first pop above is *not* animated [self.navigationController popViewControllerAnimated:YES];


Tuve este problema debido a un error tipográfico:

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

insinuado de

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

Llamaba "WillAppear" en el super en lugar de "DidAppear"


Tuve muchos problemas con el mismo problema. Lo resolví por

  1. Iniciando ViewController utilizando el método storyboad instantiateViewControllerWithIdentifier. es decir, Intro *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"introVC"];
  2. [self.tabBarController presentModalViewController : vc animated:YES];

Tengo el controlador de visualización en mi guión gráfico, por alguna razón, solo uso [[introvc alloc] init]; no funcionó para mí


Yo tenía el mismo error. Tengo una barra de pestañas con 3 elementos y estaba intentando inconscientemente llamar al controlador de vista raíz del elemento 1 en el elemento 2 de la 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

[self.parentViewController.tabBarController setSelectedIndex:0];

Espero que esto ayude a alguien.


Yo tuve el mismo problema. Llamé a un método dentro de viewDidLoad dentro de mi primer UIViewController

- (void)viewDidLoad{ [self performSelector:@selector(loadingView) withObject:nil afterDelay:0.5]; } - (void)loadingView{ [self performSegueWithIdentifier:@"loadedData" sender:self]; }

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 puede realizar demasiado rápido después de otra transición.


necesita asegurarse de que (nulo) beginAppearanceTransition: (BOOL) está apareciendo animado: (BOOL) animado y - (nulo) endAppearanceTransition se crean juntos en la clase.