昨天項目要上線,測試出來這個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/
新聞熱點
疑難解答