【问题标题】:Keep getting "Unbalanced calls to begin/end appearance transitions for <ViewController>" error不断收到“<ViewController> 开始/结束外观转换的不平衡调用”错误
【发布时间】:2014-01-22 01:34:09
【问题描述】:

我有一个几乎运行完美的应用程序。以下是我的应用的结构:

故事板上共有 6 个视图控制器。前 3 个 View Controller 是最重要的。初始视图控制器具有“登录”和“注册”按钮。 “登录”按钮模态显示登录视图控制器,“注册”按钮模态显示注册视图控制器。

注册视图控制器有 3 个字段,分别是用户名、密码和电子邮件,然后是一个“提交”按钮。提交按钮将数据提交到我的网络服务器,如果所有内容都提交成功,它会自行调用“performSegueWithIdentifier”方法。

声明如下:

[self performSegueWithIdentifier:@"superSegue" sender:self];

今晚我花了 2 个小时试图让上述方法调用起作用,它终于起作用了。为了让它工作,我必须在故事板上选择我的注册视图控制器,然后转到编辑器 > 嵌入 > 导航控制器(如果我没记错的话,我必须这样做,因为注册视图控制器是以模态方式呈现的)。然后我从我的注册视图控制器的提交按钮拖到我想要推送到的视图控制器并选择推送,然后输入一个标识符名称。

无论如何,在我尝试使用我们使用方法调用推送到的视图控制器上的后退按钮之前,上述所有操作都非常好。如果我点击后退按钮,它将进入 90% 的黑屏,顶部有一个空白导航栏和一个后退按钮,当然该后退按钮也没有任何作用。

这是我在控制台中遇到的错误:

Unbalanced calls to begin/end appearance transitions for <VerificationViewController: 0x14ed1bb0>

验证视图控制器是注册视图控制器通过 performSegueWithIdentifier 方法推送到的视图控制器。

有谁知道我该如何解决这个错误?

我在下面附上了我的故事板在 xcode 中的截图。我已经编写了一个视图控制器,但还没有连接,无论如何都不应该有所作为,因此您可以忽略 Login VC 右侧的视图控制器。

【问题讨论】:

    标签: ios objective-c uiviewcontroller uinavigationcontroller segue


    【解决方案1】:

    我今天早上在另一个 stackoverflow 问题中找到了答案。答案可以在here找到。

    当我最初设置 Push Segue 时,我单击并拖动按钮,并且还在该按钮的 IBAction 方法实现中调用 performSegueWIthIdentifier 方法。这导致在按钮按下时执行 2 个相同的 push segues。我只是将我的方法调用留在了 IBAction 中,删除了旧的 push segue,并创建了一个新的 push segue,只是这次我单击并从整个 View Controller 中拖动而不是它的按钮。

    【讨论】:

    • 我检查了我的按钮,但它没有触发 segue,但它仍然会导致不平衡调用开始/结束外观转换,使用自定义 segue
    • 另一个常见问题是没有在 UIViewController 子类中调用 super.method。例如,MyViewController.viewWillAppear() 没有调用 super.viewWillAppear() 并导致此错误,因为内部视图状态尚未更新。
    【解决方案2】:

    在我的例子中,它是 UITabBarController 的一个子类,带有一个重载的 setSelectedIndex: 方法,可以通过动画进行转换。 我发现在动画开始之前需要调用以下代码:

    [sourceVC viewWillDisappear:YES];
    [destinationVC viewWillAppear:YES];
    

    以及完成块中的以下内容:

    if (finished) {
        [sourceVC viewDidDisappear:YES];
        [destinationVC viewDidAppear:YES];
        [super setSelectedIndex:selectedIndex];
    }
    

    如果在动画结束之前发生多个 selectedIndex 更改,问题可能仍然存在。

    【讨论】:

    • 我不确定是否是这种情况,但您可能希望使用关于 UIViewController 容器的 Apple 文档中所述的 addChildViewController 和 removeFromParentController 函数(和其他函数):developer.apple.com/library/ios/featuredarticles/…
    • 我遇到了同样的问题并迅速解决了这个问题:stackoverflow.com/a/37096645/4483716希望可以帮助到某人。
    • 这个想法帮助我在为 UITabBarController 页面更改设置动画时解决了不平衡的过渡错误。我还可以使用beginAppearanceTransitionendAppearanceTransition 方法,而不是直接调用viewWillDisappear/viewWillAppearviewDidDisappear/viewDidAppear。外观转换方法的文档建议不要直接为子视图调用 viewWillAppear 等。
    【解决方案3】:

    我通过包装解决了这个问题。

    dispatch_async(dispatch_get_main_queue()) {
        //call your performSegueWithIdentifier in here
    }
    

    【讨论】:

    • 太棒了!在通过presentViewController(_:animated:completion) 在基本(根)视图控制器上从AppDelegate applicationDidBecomeActive(_:) 以模态方式呈现“锁定屏幕”视图控制器的上下文中使用此技术...在根视图控制器的窗口层次结构完全建立之前。不再需要将演示推迟到根控制器的viewDidLoad(animated:)...视图管理的丑陋解耦。谢谢!
    • 惊人的修复!打电话给popViewController(animated:)时得到了这个
    【解决方案4】:

    在我的情况下,此警告是由在显示模式视图时调用 UINavigationController 的 popToRootViewController 引起的。 当我在模式视图关闭后移动popToRootViewController 时,警告停止出现。

    【讨论】:

      【解决方案5】:

      错误原因:如果您从当前视图控制器的 viewWillAppear、loadView、init 或 viewDidLoad 方法推送/呈现另一个视图控制器,则会显示此消息

      解决方案:将您的推送/呈现代码移动到 viewDidAppear 方法将解决问题

      原因是:在 viewDidLoad 中并非所有精美的动画都已完成,而在 viewDidAppear 中一切都已完成。

      【讨论】:

        【解决方案6】:

        我工作了,这对我有好处 错误原因:如果您从 TabBarController 推送/呈现另一个视图控制器,则会显示此消息, 解决方法:请先设置viewController.modalPresentationStyle = .overCurrentContext,再设置viewController topViewController.present(vc, animated: true, completion: nil)

        【讨论】:

        • 我遇到了一个问题,即在我的 Tabbar 顶部启动时首先显示 VC。将演示文稿样式设置为当前上下文消除了我的标签栏控制器上不平衡调用的错误。谢谢安。投票认为您的帖子有用。
        猜你喜欢
        • 1970-01-01
        • 2022-10-20
        • 2016-01-30
        • 2021-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多