昨天项目要上线,测试出来这个bug,界面怎么都跳转不出来,调试了一个多小时,还是想不出来原因,后来才注意到控制台打印出来了 Whose view is not in the window hierarchy这一行,就上网搜搜,终于有大神给了解决办法,感谢感谢! 先交代下错误发生的背景:项目里有个推送,推送过来的时候会在项目里有个弹框,点击弹框的确定按钮的时候,会跳转到一个web界面,项目刚运行出来在主界面的时候,推送可以跳转出来界面,点击应用进入其他界面的时候,再推送点击弹框就不会跳转界面了。 解决办法:
在 一个 ViewController 里面调用另外一个 ViewController 是出现这个错误:该错误一般是由于在 viewDidLoad 里面调用引起的,解决办法是转移到 viewDidAppear 方法里面
在 AppDelegate.m 中调用遇到这个错误解决办法1:
UIViewController *toPRootViewController = [UIapplication sharedApplication].keyWindow.rootViewController; while (topRootViewController.presentedViewController) { topRootViewController = topRootViewController.presentedViewController; }
//[topRootViewController presentViewController:yourController animated:YES completion:nil]; //or [topRootViewController myMethod];
解决办法2:
UIStoryboard *mainstoryboard = [UIStoryboard storyboardWithName:@”MainStoryboard” bundle:nil]; LoginViewController* loginViewController = [mainstoryboard instantiateViewControllerWithIdentifier:@”LoginViewController”]; [self.window makeKeyAndVisible]; //[LoginViewController presentViewController:yourController animated:YES completion:nil]; //or [LoginViewController myMethod];
我遇到的主要是第一种情况,上面的情况说,是在控制器A里调用控制器B的时候,控制器A还没有初始化完,就调用了控制器B,让把调用控制器B的方法写在viewDidAppear里,但是我想了想,我的情况和这个不太一样,我是整个项目有一个父类控制器,所有的控制器都是继承自父类控制器的,项目刚运行的时候第一个界面会触发父类控制器会走ViewDidLoad这个方法,再单击进入其他界面的时候就不会调用ViewDidLoad这个方法了,我的通知是写在ViewDidLoad方法里的,所以我想在第二次触发父类控制器的时候通知就不管用了,所以我把通知写在了ViewWillAppear,这下可以正常跳转界面了!!!,very good!,这是我遇到的情况,仅供大家参考。
补充,今天中午兴高采烈的来写博客了,下午又出现问题了,我了个去!!!!,只能在主界面跳转web界面,其他界面接受推送都跳转不了web界面,现在终于解决:跳转界面的时候延迟2秒,还有一个地方,跳转界面的时候模态推出需要是最上一层控制器模态推出其他控制器,才可以正常跳转到web界面,至于怎么获取到最上一层控制器看链接:http://pinkstone.co.uk/how-to-avoid-whose-view-is-not-in-the-window-hierarchy-error-when-presenting-a-uiviewcontroller/
新闻热点
疑难解答