我在模拟我的应用程序时遇到了这个问题,它不是错误或警告,但出现在控制台中,以前有人遇到过吗?
我在模拟我的应用程序时遇到了这个问题,它不是错误或警告,但出现在控制台中,以前有人遇到过吗?
Answers:
就我而言,当您快速单击一个tableview中的两个选项卡时,会发生此错误。
结果导致标题名称错误,后退按钮消失。有人提到当您按下视图时,set animated:NO
。该错误将消失,但仍会导致某些奇怪的行为。它会推送两个视图,然后您需要后退两次以返回tableview屏幕。
我尝试解决此问题的方法:
加 BOOL cellSelected;
在 viewWillAppear
cellSelected = YES;
在didselectcell委托中 if (cellSelected){cellSelected = NO; do action ; }
这有助于防止非常快地单击两个不同的单元格。
就我而言,这是我[self performSegueWithIdentifier:@"SomeIdentifier" sender:self];
在UINavigationController
项目的viewDidLoad
方法内触发时发生 的。
将其移入viewDidAppear
方法可以解决问题。
原因很可能是,viewDidLoad
并非所有精美的动画都已经完成,而viewDidAppear
一切都已完成。
我也遇到了这个问题。我找到了解决此问题的两种方法:
UINavigationController
解决此问题的地方找到了子类。缓冲导航控制器您应该在不同的循环中运行代码以避免这种情况
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];
});
dispatch_async
主队列中。问题dispatch_async
是它要等到主队列上的所有其他动画都完成后再进行。它比使用延迟要好得多,因为:1-您将永远不知道延迟是否足够,这取决于您的主机设备2-您最终会超过延迟并且会出现延迟。试试这个:dispatch_async(dispatch_get_main_queue(), ^{[self presentViewController:self.yourModalVC animated:YES completion:nil];});
使用导航控制器并向其推送其他控制器时,我遇到了相同的问题。我尝试使用缓冲导航控制器和其他几种方法,但对我而言不起作用。花了一些时间来弄清楚之后,我注意到如果您在进行先前的事务(动画)时尝试推送新的视图控制器(我估计持续时间约为0.5秒),就会发生此问题。无论如何,我通过委派导航控制器并等待先前的动画完成做出了快速解决方案。
确保您不要忘记在-viewWillAppear,-viewDidAppear,-viewDidLoad,-viewWillDisappear,-viewDidDisappear中调用该方法的重载方法。例如,在我的情况下,我不匹配这样的方法名称:
-(void)viewDidAppear
{
[super viewDidDisappear];
//some code staff
..
}
注意出现和消失方法不匹配
super.viewWillAppear()
在内呼叫viewDidDisappear()
。
我遇到了这个问题,因为我从没有UITabbar的viewController中调用了UIPrintInteractionController,并且没有UINavigationBar。看来UIPrintInteractionController没有获得正确的printInteractionControllerParentViewController。在委托中实现该方法并返回当前的rootViewController对我有用。
- (UIViewController*)printInteractionControllerParentViewController:(UIPrintInteractionController*)printInteractionController;
我有一个类似的问题,涉及倒带模式对话框。在这里发布解决方案...
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)
}
}
}
对于它的价值,当[super viewDidLoad:animated]
我的viewDidLoad
覆盖中不包含对的调用时,出现了相同的错误。
出现消息的原因:仅当您从,或当前View Controller的方法推/显示另一个View Controller时viewWillAppear
,才会显示此消息。loadView
init
viewDidLoad
清除错误消息的方法:将您的推送/演示代码移至viewDidAppear
方法将解决此问题
斯威夫特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)
}
当我忘记设置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: