在AppDelegate里面要彈出一個彈框,這個彈框的作用就是:當用戶賬號在別的客戶端登錄的時候,彈出提示并引導用戶從新登錄,但是實際測試中這個彈出效果時好時壞,并爆出了警告
Warning: Attempt to present * on * which is already presenting *Warning: Attempt to present (要被presented的控制器)? on (哪個控制器來presenting) which is already presenting (已經被presenting的控制器).
現在把修改后的彈框代碼附上
之前的代碼是 先模態推出彈框,在彈框的動作中再模態推出到登錄頁,這樣就容易出現效果時有時無的問題,具體的原因就是:
當你模態推出一個控制器的時候,必須要先dismiss以后,才能推出下個頁面,否則就推不出去.
還要就是,在AppDelegate里面彈出彈框時,一定要取出最外層的控制器,用這個控制器推出彈框,否則也容易出現彈框時有時無的問題.
所以,針對以上問題,做出了修改,
首先:彈出彈框依舊使用模態轉換來推出,
然后:在彈框里跳轉到登錄界面采用直接轉換根視圖的方法,這樣就不容易出問題了,代碼如圖片所示.
(但是這樣會有另一個警告: Presenting view controllers on detached view controllers is discouraged. 但是每次彈框還是依然可以正常的彈出,跳轉登錄頁也沒什么問題);此處如果有好的解決方案,歡迎私聊??
此處分享一個獲取當前最外層控制器的方法:
-(UIViewController *)topViewController{
if (!_topViewController) {
_topViewController = [self topViewControllerWithRootViewController:self.view.window.rootViewController];
}
return _topViewController;
}
- (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController
{
if ([rootViewController isKindOfClass:[UITabBarController class]]) {
UITabBarController *tabBarController = (UITabBarController *)rootViewController;
return [self topViewControllerWithRootViewController:tabBarController.selectedViewController];
} else if ([rootViewController isKindOfClass:[UINavigationController class]]) {
UINavigationController* navigationController = (UINavigationController*)rootViewController;
return [self topViewControllerWithRootViewController:navigationController.visibleViewController];
} else if (rootViewController.presentedViewController) {
UIViewController* presentedViewController = rootViewController.presentedViewController;
return [self topViewControllerWithRootViewController:presentedViewController];
} else {
return rootViewController;
}
}
簡書里邊怎么引用代碼啊!!!,我要吐槽,看起來寫的亂七八糟.