对<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
一切都已经完成了。
我也有这个问题。 我发现了两个解决这个问题的方法:
- 你可以看到上面的解决scheme。
- 我从
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];
看看这是否解决了这个问题,在我的情况下,这个伎俩。
消息的原因:当且仅当您正在推送/呈现当前视图控制器的viewWillAppear
, loadView
, init
或viewDidLoad
方法中的另一个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调用正在进行。
它导致相同的UIViewController
由UINavigationController
推送两次,并给出了这个警告。
我得到这个问题,因为我从一个没有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
。