对<UITabBarController:0x197870>开始/结束外观转换的不平衡调用

我读了关于另一个用户遇到类似的错误 ,但这个错误是在不同的情况下。

最初我添加了一个视图控制器时收到了这条消息:

Unbalanced calls to begin/end appearance transitions for <UITabBarController: 0x197870> 

该应用程序的结构如下:

我有一个5 TabBarController链接到5视图控制器。 在最初的显示选项卡中,我召唤出一个新的视图控制器作为应用程序的介绍。

我使用这段代码来调用介绍视图控制器:

 IntroVC *vc = [[IntroVC alloc] init]; [self presentModalViewController:vc animated:YES]; [vc release]; 

IntroVC视图控制器显示后,上面的错误显示。

PS我正在使用xCode 4.2和iOS 5.0 SDK,开发iOS 4.3应用程序。

没有看到更多的周围的代码,我不能给出明确的答案,但我有两个理论。

  1. 你没有使用UIViewController的指定初始化程序initWithNibName:bundle: 尝试使用它,而不是只是init

  2. 另外, self可能是标签栏控制器的视图控制器之一。 始终在最顶层的视图控制器中显示视图控制器,这意味着在这种情况下要求标签栏控制器代表视图控制器显示重叠视图控制器。 您仍然可以将任何callback委托保留给实际的视图控制器,但是您必须具有标签栏控制器存在和解散。

我通过将animation从YES更改为NO来解决此错误。

从:

 [tabBarController presentModalViewController:viewController animated:YES]; 

至:

 [tabBarController presentModalViewController:viewController animated:NO]; 

由丹发表

您可以通过在应用程序完成初始化之前呈现模态vc来生成此警告。 即启动一个选项卡式的应用程序模板应用程序,并在self.tabBarController之上呈现一个模态vc作为应用程序中的最后一行:didFinishLaunching。 出现警告。 解决方法:首先让堆栈展开,在另一个方法中呈现模态vc,用performSelector withDelay调用:0.0

尝试将该方法移到viewWillAppear中,并保护它,使其只执行一次(build议设置一个属性)

我有同样的问题。 我在我的第一个UIViewController里面调用了viewDidLoad一个方法

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

在第二个UIViewController里面我也做了0.5秒的延迟。 将延迟更改为更高的值后,它工作正常。 这就像是赛格不能再经过一个赛季后太快。

我有同样的问题,当我需要从另一个视图控制器呈现我的login视图控制器如果用户没有授权,我做了我的另一个视图控制器的ViewDidLoad方法(如果没有授权 – > presentModalViewController)。 当我开始使用ViewDidAppear方法时,我解决了这个问题。 我认为,ViewDidLoad只初始化属性,然后实际显示视图algorithm开始! 这就是为什么你必须使用viewDidAppear方法来进行模态转换!

同样的问题,我有很多问题。 我解决了这一个

  1. 使用storyboad instantiateViewControllerWithIdentifier方法启动ViewController。 即Intro *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"introVC"];
  2. [self.tabBarController presentModalViewController : vc animated:YES];

我在故事板中有viewcontroller,出于某种原因只使用[[introvc alloc] init]; 没有为我工作。

我通过写作来解决它

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

我有同样的错误。 我有一个标签栏有3个项目,我不知不觉地试图调用我的标签栏的项目2中的项目1的根视图控制器使用performSegueWithIdentifier

会发生什么事是它调用视图控制器并在几秒钟后返回到项目2的根视图控制器并logging该错误。

显然,你不能调用一个项目的根视图控制器到另一个项目。

所以,而不是执行performSegueWithIdentifier

我用[self.parentViewController.tabBarController setSelectedIndex:0];

希望这有助于某人。

我有同样的问题,并认为我会张贴,以防其他人遇到类似的情况。

在我的情况下,我已经附加了一个长按手势识别器到我的UITableViewController。

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

在我的onLongPressselect器中,我启动了我的下一个视图控制器。

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

在我的情况下,我收到错误消息,因为长按识别器发射多次,结果,我的“SomeViewController”被多次推入堆栈。

解决方法是添加一个布尔值来指示SomeViewController何时被推入堆栈。 当我的UITableViewController的viewWillAppear方法被调用时,我把布尔值设置为NO。

我有这个问题与第三方代码。 有人忘了在viewWillAppear和viewWillDisappear中设置超级内部的自定义TabBarController类。

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

我有这个问题,因为一个错字:

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

侮辱了

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

它在超级中叫“WillAppear”而不是“DidAppear”

对于很多情况下的另一个解决scheme是确保UIViewController之间的转换发生不适合(如在初始化期间)过程完成后,通过执行:

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

这也是普遍的pushViewController:animated:

Swift 2+中对我来说是这样的:

我有故事板中的UITabBarViewController,我有像这样的selectedIndex属性:

在这里输入图像说明

但是我删除它,并添加我的初始类的viewDidLoad方法,如下所示:

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

我希望我能帮助别人。

其实你需要等到推动animation结束。 所以你可以委托UINavigationController,并防止推动,直到animation结束。

 - (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]; } } 

正如@丹build议,我的问题是,在UITabBarController准备好之前,我正在展示模态vc。 然而,在呈现视图控制器之前(从我的testing中,我需要在performSelector:withDelay:使用0.05-0.1s的延迟),依靠固定的延迟,我感到不舒服。 我的解决scheme是添加一个块,调用UITabBarControllerviewDidAppear:方法:

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 

现在在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; }; 

我发现,如果您使用的是故事板,则需要将呈现新视图控制器的代码放在viewDidAppear中。 它也将摆脱“呈现视图控制器在分离的视图控制器是劝阻”的警告。

如果你正在使用transitioningDelegate (而不是在这个问题的例子),也将modalPresentationStyle设置为modalPresentationStyle

迅速

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

你需要确保 – (void)beginAppearanceTransition:(BOOL)isAppearing animated:(BOOL)animation和 – (void)endAppearanceTransition是在课堂上一起创build的。

当我从根TVC导航到TVC A然后导航到TVC B时,我遇到了这个问题。在点击TVC的“加载”button后,BI想要直接跳回根TVC(为什么不需要重新访问TVC A) 。 我有:

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

…给出了错误“不平衡的呼叫开始/结束等”。 下面修正了错误,但没有animation:

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

这是我的最终解决scheme,没有错误,仍然是animation:

 //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]; 

当我将一个UIButton连接到故事板segue动作(在IB中)时遇到了这个错误,但后来决定让这个button以编程方式调用performSegueWithIdentifier忘记从IB中删除第一个。

本质上,它执行了两次segue调用,给了这个错误,实际上推了两次我的观点。 解决的办法是删除一个segue调用。

希望这可以帮助像我一样累的人!