
[英]Unbalanced calls to begin/end appearance transitions for <ViewController>
[英]Keep getting “Unbalanced calls to begin/end appearance transitions for <ViewController>” error
我有一个几乎完美运行的应用程序。 以下是我的应用程序的结构:
故事板上共有6个视图控制器。 前3个视图控制器是最重要的。 初始视图控制器具有“登录”和“注册”按钮。 “登录”按钮以模态方式呈现登录视图控制器,“注册”按钮以模态方式呈现注册视图控制器。
注册视图控制器有3个用户名,密码和电子邮件字段,然后是“提交”按钮。 提交按钮将数据提交给我的Web服务器,如果所有内容都成功提交,则会调用“performSegueWithIdentifier”方法。
这是声明:
[self performSegueWithIdentifier:@"superSegue" sender:self];
我今晚花了2个小时试图让上面的方法调用工作,它最终确实有效。 为了让它工作,我不得不在故事板上选择我的注册视图控制器,然后转到编辑器>嵌入>导航控制器(如果我没记错的话,我必须这样做,因为注册视图控制器是以模态方式呈现的)。 然后我从我的注册视图控制器的提交按钮拖动到我想要推送到的View Controller,然后选择Push,然后输入标识符名称。
无论如何,以上所有工作完全正常,直到我尝试使用我们推送到使用方法调用的View Controller上的后退按钮。 如果我点击后退按钮,它会进入90%的黑色屏幕,顶部有一个空白的导航栏,后面有一个按钮,当然后面按钮也没有任何效果。
这是我在控制台中收到的错误:
Unbalanced calls to begin/end appearance transitions for <VerificationViewController: 0x14ed1bb0>
验证视图控制器是注册视图控制器通过performSegueWithIdentifier方法推送的视图控制器。
有谁知道如何解决这个错误?
我在下面列出了我的故事板在xcode中的样子。 有一个我已经编码但尚未连接的视图控制器,不管怎样都不应该有所不同,所以你可以忽略Login VC右侧的View Controller。
今天早上我在另一个stackoverflow问题中找到了答案。 答案可以在这里找到。
当我最初设置Push Segue时,我点击并从按钮拖动,并且还在该按钮的IBAction方法实现中调用performSegueWIthIdentifier方法。 这导致在按钮按下时执行2个相同的推动段。 我刚刚把我的方法调用留在了IBAction中,删除了旧的push segue,并且只是这次我点击并从整个View Controller而不是它的按钮拖动时创建了一个新的push segue。
我通过包装来解决这个问题。
dispatch_async(dispatch_get_main_queue()) {
//call your performSegueWithIdentifier in here
}
在我的例子中,它是UITabBarController
的子类,带有重载的setSelectedIndex:
方法,用于动画转换。 我发现在动画开始之前需要调用以下内容:
[sourceVC viewWillDisappear:YES];
[destinationVC viewWillAppear:YES];
以及完成块中的以下内容:
if (finished) {
[sourceVC viewDidDisappear:YES];
[destinationVC viewDidAppear:YES];
[super setSelectedIndex:selectedIndex];
}
如果在动画结束之前发生多个selectedIndex更改,则可能仍会出现此问题。
在我的情况下,这个警告是由显示模态视图时调用UINavigationController的popToRootViewController
引起的。 当模态视图解除后我移动popToRootViewController
,警告停止出现。
错误原因 :如果从当前View Controller的viewWillAppear,loadView,init或viewDidLoad方法推送/显示另一个View控制器,则会显示此消息
解决方案 :将推送/呈现代码移动到viewDidAppear方法将解决问题
原因是:在viewDidLoad中,并非所有花哨的动画都已经完成,而在viewDidAppear中,一切都已完成。
我工作了它对我有好处原因错误:如果您从TabBarController推送/呈现另一个View控制器,则会显示此消息,解决方案:请设置viewController.modalPresentationStyle = .overCurrentContext
,然后显示viewController
topViewController.present(vc, animated: true, completion: nil)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.