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

我有这个问题,当我模拟我的应用程序,它不是一个错误或警告,但它出现在我的控制台,有没有人曾经经历过这个?

在我的情况下,当你非常快地点击tableview中的两个选项卡时,就会发生这个错误。

结果导致错误的标题名称,后退button消失。 有人提到,当你推动视图时, set animated:NO 。 错误会消失,但仍然会导致一些奇怪的行为。 它推动两个视图,然后你需要返回两次,以获取表视图屏幕。

方法我试图解决这个问题:

add BOOL cellSelected;

viewWillAppear cellSelected = YES;

在didselectcell代表if (cellSelected){cellSelected = NO; do action ; } if (cellSelected){cellSelected = NO; do action ; }

这有助于防止快速点击两个不同的单元格。

在我的情况下,当我触发[self performSegueWithIdentifier:@"SomeIdentifier" sender:self];UINavigationController项目的viewDidLoad方法中。

将它移到viewDidAppear方法中解决了这个问题。

原因很可能是viewDidLoad并不是所有的花式animation都已经完成,而viewDidAppear一切都已经完成了。

我也有这个问题。 我发现了两个解决这个问题的方法:

  1. 你可以看到上面的解决scheme。
  2. 我从UINavigationController中find了解决此问题的子类。 缓冲导航控制器

您应该在不同的循环中运行您的代码以避免这种情况

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

同样的问题,我有很多问题。 我以这种方式解决了这个问题

1)您没有使用UIViewController's指定初始化程序initWithNibName:bundle: 尝试使用它,而不是只是init

2)设置animated:YES一个否,并解决了这个问题。 例如。 [self.navigationController pushViewController: viewController_Obj animated:NO];

我有使用导航控制器相同的问题,并推动其他控制器。 我试图使用缓冲导航控制器和其他几种方法,但它并没有为我工作。 花了一些时间来弄清楚,我注意到,如果你尝试推动新的视图控制器,而前面的事务(animation)正在进行(我猜大约0.5秒的持续时间),则会发生此问题。 无论如何,我委托导航控制器,并等待以前的animation完成快速解决scheme。

确保你不要忘记在-viewDillAppear,-viewDidAppear,-viewDidLoad,-viewWillDisappear,-viewDidDisappear在你的方法的重载调用适当的超级方法。 例如在我的情况下,我不匹配的方法名称是这样的:

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

注意出现消失的方法是不匹配的

“非平衡呼叫开始/结束外观转换为'

说animation是在上次关联的animation没有完成之前开始的。 那么,在推新的视窗控制器之前,你是否会popup视窗控制器? 或者可能会跳到根? 如果是的话,尝试这样做没有animation,即[self.navigationController popToRootViewControllerAnimated:NO];

看看这是否解决了这个问题,在我的情况下,这个伎俩。

消息的原因:当且仅当您正在推送/呈现当前视图控制器的viewWillAppearloadViewinitviewDidLoad方法中的另一个View控制器时,才会显示此消息

删除错误消息的方法:将您的推送/呈现代码移动到viewDidAppear方法将解决问题

如果您使用模式视图控制器添加视图作为子视图,则会发生这种情况。 最好用:

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

这基本上是说,视图生命周期并没有简化为那些您试图显示的viewControllers。

尝试时我有类似的问题:

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

在一个像- (void) popUpToLevelTwo; ,并把一个return; 在函数的结尾解决问题

我也有这个

 [self dismissModalViewControllerAnimated:YES]; 

我把YES改为NO ,解决了这个问题。

当我使用导航控制器的popup方法时,我也有同样的问题在我的应用程序中,我使用一个单独的导航控制器的逻辑,所以避免使用导航栏,它总是隐藏的。 然后,我使用自定义视图和通知来处理后台button,这是事件。 通知观察员已经注册并且不被删除。 所以通知会触发两次,并且会造成上述错误。 彻底检查您的代码是否有这样的错误

对于它的价值,我没有在我的viewDidLoad覆盖中包含对[super viewDidLoad:animated]的调用时得到了同样的错误。

当我点击一个NIB的button时,我也遇到了这个问题。 事实certificate,我不小心连线button发送一个事件给两个IBAction方法,其中每个做一个pushViewController:animated:

我已经执行了一些逻辑,等待推送UIViewController直到所有的数据被下载。 在这个逻辑中有一个错误,导致推进UIViewController过早,而另一个API调用正在进行。

它导致相同的UIViewControllerUINavigationController推送两次,并给出了这个警告。

我得到这个问题,因为我从一个没有UITabbar的viewController调用一个UIPrintInteractionController,也没有UINavigationBar。 看来UIPrintInteractionController没有得到正确的printInteractionControllerParentViewController。 在委托中实现方法并返回当前的rootViewController为我工作。

  - (UIViewController*)printInteractionControllerParentViewController:(UIPrintInteractionController*)printInteractionController; 

我有一个类似的问题,涉及倒回modal dialog。 在这里发布解决scheme…

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

[问题]

Nav Controller – > VC1 -Push – > VC2 -PopOver或Modal Segue – > VC3。

VC3退回到VC1。

当从VC2到VC3的Segue是PopOver和Modal时,展开结束于警告:UIViewController的开始/结束外观转换的不平衡调用“

如果从VC到VC的争夺被推动,警告就消失了。

[解]

如果放松的逻辑会照顾到这一点,那将是非常好的。 也许这是一个错误,也许不是。 无论哪种方式,解决的办法是使VC2(具有popup的控制器)倒带的目标,然后等待它popup导航控制器之前完成出现。 这确保倒退(反向popup)animation有足够的时间完成后再往回移动。 即使animationclosures,它仍然需要等待,否则你会得到错误。

你的VC2代码应该如下。 (迅速)

 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) } } } 

当我忘记设置Break时,我有这个问题; 在switch语句中推入视图后!

像这儿:

 case 1:{ SomeViewController *someViewController = [[SomeViewController alloc]initWithNibName:@"SomeViewController" bundle:Nil]; [self.navigationController pushViewController:someViewController animated:YES]; [someViewController release]; } break; //Forgetting to set break here: 

错误“不平衡调用开始/结束外观转换”的原因是当您导航|时 同时进行两次

一个解决scheme是,

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

如果你尝试在加载完成之前closures一个UIViewController,你可以运行它。

我在控制台中有这个消息,并完全集中在呈现新的UIViewController的UIViewController,没有成功。 我终于发现问题出在我提出的UIViewController中,因为用户没有login到他们的账户而被解雇。

希望这有助于某人。

这对我来说是一个艰难的事情:我已经超越了

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

而不是压倒一切:

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

在我的窗口根目录导航控制器。 然后一个儿童导航控制器抱怨,当推另一个视图控制器与上述警告。 警告并不是最糟糕的,最大的问题是,那个儿童导航控制器的代表没有再被叫到。 weired。

在我的情况下,我从NSURL '方法中获取NSData