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


93

我在模拟我的应用程序时遇到了这个问题,它不是错误或警告,但出现在控制台中,以前有人遇到过吗?


您是否在该视图控制器中制作了某种动画?

1
是。我有一个打开的动画,可以将图像分开滑动,现在我注意到只有在将代码加载到手机上时才会发生此错误。
C.Johns,2011年

错误消息提示您开始过渡,但缺少对相应end方法的调用。

1
有同样的事情。有什么解决办法吗?
seeafish

也正在寻找解决方案
barfoon 2011年

Answers:


48

就我而言,当您快速单击一个tableview中的两个选项卡时,会发生此错误。

结果导致标题名称错误,后退按钮消失。有人提到当您按下视图时,set animated:NO。该错误将消失,但仍会导致某些奇怪的行为。它会推送两个视图,然后您需要后退两次以返回tableview屏幕。

我尝试解决此问题的方法:

BOOL cellSelected;

viewWillAppear cellSelected = YES;

在didselectcell委托中 if (cellSelected){cellSelected = NO; do action ; }

这有助于防止非常快地单击两个不同的单元格。


5
我的猜测是有些措辞很难理解。我进行了一些编辑以提高可读性。
凯尔·克莱格

42

就我而言,这是我[self performSegueWithIdentifier:@"SomeIdentifier" sender:self];UINavigationController项目的viewDidLoad方法内触发时发生 的。

将其移入viewDidAppear方法可以解决问题。

原因很可能是,viewDidLoad并非所有精美的动画都已经完成,而viewDidAppear一切都已完成。


谢谢。我在穴居人时代迷失了自己,在那里我通过代码创建每个UI元素。故事板的东西对我来说是新的。
Kiran Kulkarni 2014年

21

我也遇到了这个问题。我找到了解决此问题的两种方法:

  1. 您可以在上方看到此解决方案。
  2. 我从UINavigationController解决此问题的地方找到了子类。缓冲导航控制器

15

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

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

7
一个更好的主意是将演示动画放在一个dispatch_async主队列中。问题dispatch_async是它要等到主队列上的所有其他动画都完成后再进行。它比使用延迟要好得多,因为:1-您将永远不知道延迟是否足够,这取决于您的主机设备2-您最终会超过延迟并且会出现延迟。试试这个:dispatch_async(dispatch_get_main_queue(), ^{[self presentViewController:self.yourModalVC animated:YES completion:nil];});
M. Porooshani 2014年

12

同一问题我遇到很多问题。我这样解决了

1)您没有使用UIViewController's指定的初始值设定项initWithNibName:bundle:。尝试使用它而不是init

2)设置animated:YES为NO,即解决了问题。例如。[self.navigationController pushViewController: viewController_Obj animated:NO];


7

使用导航控制器并向其推送其他控制器时,我遇到了相同的问题。我尝试使用缓冲导航控制器和其他几种方法,但对我而言不起作用。花了一些时间来弄清楚之后,我注意到如果您在进行先前的事务(动画)时尝试推送新的视图控制器(我估计持续时间约为0.5秒),就会发生此问题。无论如何,我通过委派导航控制器并等待先前的动画完成做出了快速解决方案。


谢谢!将我的逻辑移到viewDidAppear有助于解决我的情况。
Jaroslav 2013年

7

确保您不要忘记在-viewWillAppear,-viewDidAppear,-viewDidLoad,-viewWillDisappear,-viewDidDisappear中调用该方法的重载方法。例如,在我的情况下,我不匹配这样的方法名称:

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

注意出现消失方法不匹配


仅仅花了两个小时来调试这个问题,事实就是这样。super.viewWillAppear()在内呼叫viewDidDisappear()
丹尼尔·伍德

感谢您的提示。这不是我唯一的问题,但这有所帮助!
安东尼C

4

“开始/结束外观转换的不平衡呼叫”

说动画在未完成最后一个相关动画之前就开始了。那么,您是否在推送新的视图控制器之前弹出了任何一个视图控制器?还是可能突然扎根?如果是的话,尝试不使用动画即[self.navigationController popToRootViewControllerAnimated:NO];

看看这是否可以解决问题,就我而言,这可以解决问题。


1
这是关键:同时弹出或更改其他ViewController过渡。
罗基

2

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

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

2

我有一个类似的问题,涉及倒带模式对话框。在这里发布解决方案...

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

[问题]

导航控制器-> VC1-推送-> VC2 -PopOver或Modal Segue-> VC3。

VC3正在退回到VC1。

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

如果从VC到VC的Segue被推送,则警告消失。

[解]

如果放松逻辑可以解决这一问题,那就太好了。也许是一个错误,也许不是。无论哪种方式,解决方案都是使VC2(具有弹出窗口的控制器)成为倒带的目标,然后等待其完成显示,然后弹出导航控制器。这样可以确保后退(反向弹出)动画有足够的时间来完成,然后再进一步移回。即使关闭了动画,它仍然必须等待,否则您将收到错误。

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

1

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

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

基本上是说,您试图显示的那些viewController的视图生命周期没有得到简化。


1

尝试做时,我遇到类似的问题:

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

在类似的函数中- (void) popUpToLevelTwo;,并将a return;放在函数的末尾可解决问题


1

我也有这个

[self dismissModalViewControllerAnimated:YES];

我换了YES一个NO,而且解决了这个问题。


1

当我使用navigationcontroller的pop方法时,我也遇到同样的问题。在我的应用中,我对导航控制器使用了单独的逻辑,因此避免了使用导航栏,并且它总是被隐藏。然后,我使用自定义视图和通知来处理后退按钮及其事件。通知观察者已注册且未删除。因此,该通知将触发两次,并产生上述错误。彻底检查代码以获取此类错误


1

对于它的价值,当[super viewDidLoad:animated]我的viewDidLoad覆盖中不包含对的调用时,出现了相同的错误。


1
您可能是说viewDidAppear?viewDidLoad没有参数
Fabio Napodano 2014年

1

当我从NIB轻按一个按钮时,我也遇到了这个问题。事实证明,我不小心将按钮连接到一个事件,以将事件发送到两个IBAction方法,每个方法都执行pushViewController:animated:


谢谢 !!你节省我的时间!
VD

1

我实现了一些逻辑,以等待推送UIViewController直到下载完所有数据。此逻辑中有一个错误,导致将UIViewController在进行另一个API调用时过早。

它导致同一UIViewController操作被两次推送,UINavigationController并发出此警告。


1

出现消息的原因:仅当您从,或当前View Controller的方法推/显示另一个View Controller时viewWillAppear,才会显示此消息。loadViewinitviewDidLoad

清除错误消息的方法:将您的推送/演示代码移至viewDidAppear方法将解决此问题


1

斯威夫特4

我的问题是我要在完成当前的VC渲染之前呈现另一个VC。

解决的方法是在快速延迟后显示我的nextVC。

你不应该做的

override func viewDidLoad() {
    super.viewDidLoad() 
    self.present(MyNextVC(), animated: true, completion: nil)
}

您应该做什么

override func viewDidLoad() {
    super.viewDidLoad() 
    //Wait until the view finished to be constructed
    perform(#selector(showMyNextVC), with: nil, afterDelay: 0.01)
}

@objc func showCityList() {
    self.present(MyNextVC(), animated: true, completion: nil)
}

1
而不是使用延迟,我将代码放在viewDidAppear或viewDidLayoutSubviews中。
普拉纳夫

0

当我忘记设置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:

0

错误“导致开始/结束外观转换的呼叫不平衡”背后的原因是当您导航| 同一时间两次


0

一种解决方案是

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

0

如果尝试在完成加载之前关闭UIViewController,则可以遇到此问题。

我在控制台中收到此消息,并且完全专注于呈现新UIViewController的UIViewController,但没有成功。最终,我发现问题出在我正在呈现的UIViewController中,因为用户未登录其帐户而将其关闭。

希望这对某人有帮助。


0

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

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

不覆盖:

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

在我的窗口根导航控制器中。则儿童导航控制器在按下带有上述警告的另一个视图控制器时抱怨。警告不是最坏的情况,最大的问题是,不再有儿童导航控制器的代表被呼叫。很奇怪


0

就我而言,我是NSDataNSURL' viewDidLoad'方法内部获取的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.