<FirstViewController: 0x2a2c00>的开始/结束出现转换调用不平衡。

96

当我模拟我的应用时,出现了这个问题,它不是一个错误或警告,但它出现在我的控制台中,请问有没有人以前经历过这种情况?


1
是的。我有一个开场动画,它会将两张图片滑开,但我现在注意到只有在将代码加载到手机上时才会出现此错误。 - C.Johns
1
有同样的问题。这个有解决方案吗? - seeafish
也在寻找解决方案。 - barfoon
当我在MPMoviePlayerController WillExitFullscree和PlaybackDidFinish的通知期间执行多个[navigationController popViewController:animated:]时,我遇到了类似的问题。因此,我添加了一个检查,以确保我的控制器是顶级控制器,并且消息从控制台日志中消失了。if (mp!= NULL){ [mp.view removeFromSuperview]; [mp stop]; [mp release]; mp = NULL; } NSLog(@“之后的顶部视图控制器:%@”,[[self navigationController] topViewController]); 如果([[self navigationController] topViewController] == self){ - sidslog
我也在寻找解决方法! - ZYiOS
显示剩余5条评论
25个回答

51

在我的情况下,当您在tableview中非常快速地点击两个标签时,就会出现此错误。

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

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

添加 BOOL cellSelected;

viewWillAppearcellSelected = YES;

在didselectcell委托中 if (cellSelected){cellSelected = NO; 执行操作 ; }

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


5
我猜测有些措辞难以理解。我进行了一些修改,以提高可读性。 - Kyle Clegg

43
在我的情况下,当我在 UINavigationController 项的 viewDidLoad 方法中触发了 [self performSegueWithIdentifier:@"SomeIdentifier" sender:self]; 时,出现了问题。将其移动到 viewDidAppear 方法中可以解决这个问题。很可能的原因是在 viewDidLoad 中,尚未完成所有花哨的动画,而在 viewDidAppear 中所有内容都已经完成。

谢谢。我已经迷失在穴居人时代,我正在通过代码创建每个单独的UI元素。Storyboard是新的东西对我来说。 - Kiran Kulkarni
1
这是我在2022年使用Swift 5时的解决方案 - 我正在切换根视图控制器,所以我认为这就是原因。但是我将其放在了WILLAPPEAR中-> 经过一小时的搜索和研究后,我看到了这个并将其移动到了DIDAPPEAR中 - 现在一切都很顺利!谢谢 - devjme

21

我也有这个问题。我找到了两个解决方法:

  1. 您可以查看上面的解决方案。
  2. 我发现从UINavigationController进行子类化,可以解决这个问题。缓冲导航控制器

16

为避免此问题,您应该在不同的循环中运行代码。

 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

12

我遇到了同样的问题,我通过以下方法解决:

1)您没有使用UIViewController的指定初始化器initWithNibName:bundle:,尝试改用它而不是仅使用init

2)将animated:YES更改为NO,问题得到解决。 例如:[self.navigationController pushViewController:viewController_Obj animated:NO];


7

请确保您在重载以下方法时不要忘记调用正确的超级方法:-viewWillAppear,-viewDidAppear,-viewDidLoad,-viewWillDisappear和-viewDidDisappear。例如,在我的情况下,我误用了方法名称,如下所示:

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

请注意,出现和消失方法不匹配。

刚刚花了大约两个小时来调试这个问题,结果发现是在viewDidDisappear()中调用了super.viewWillAppear() - Daniel Wood
谢谢这个提示。虽然它并不是我的唯一问题,但它确实有所帮助! - Anthony C

7

我曾使用导航控制器并将其他控制器推送到其中,遇到了相同的问题。

我尝试使用Buffered Navigation Controller和其他几种方法,但都没有成功。在花费一些时间弄清楚后,我注意到如果你试图在先前的事务(动画)正在进行中(大约0.5秒的持续时间),就会出现这个问题。无论如何,我通过委托导航控制器并等待上一个动画完成来快速解决了这个问题。


谢谢!将我的逻辑移动到viewDidAppear在我的情况下有所帮助。 - Jaroslav

5

'Unbalanced calls to begin/end appearance transitions for '

意思是在上一个相关的动画没有完成时就启动了新的动画。所以,您是在推入新的视图控制器之前弹出任何视图控制器吗?或者可能是弹出到根视图控制器?如果是这样,请尝试在没有动画的情况下执行此操作,例如:[self.navigationController popToRootViewControllerAnimated:NO];

看看是否解决了问题,在我的情况下,这个方法奏效了。


1
这是关键:同时弹出或更改其他视图控制器的转换。 - Rocky

4

我曾经遇到类似的问题,涉及到重新打开模态对话框。在这里发布了解决方案...

https://dev59.com/5I7da4cB1Zd3GeqP9SZA#38795258

[问题]

导航控制器 -> VC1 -推入--> VC2 -弹出或模态转场--> VC3。

VC3正在向VC1回溯。

当从VC2到VC3的Segue为PopOver和Modal时,回溯将以警告结束:“UIViewController的开始/结束外观转换不平衡”。

如果从VC到VC的Segue是push,则不会出现警告。

[解决方案]

如果回溯逻辑能够处理这个问题那就太好了。也许这是一个错误,也许不是。无论哪种方式,解决方法是将VC2(具有弹出窗口的控制器)设置为反转目标,然后等待它完成出现操作再弹出导航控制器。这确保了倒带(反向弹出)动画有足够的时间来完成进一步的移动之前。即使关闭动画,仍然需要等待,否则会出现错误。

您应该按照以下方式编写VC2的代码。 (Swift)

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

2

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接