最近在做一個郵政的項目,在剛進入郵寄控制器的時候需要對用戶是否有未交寄的訂單進行判斷,如果有的話需要用提醒框告訴用戶,如下圖
可是在網(wǎng)絡(luò)狀態(tài)不好的情況下莹菱,接口的響應(yīng)需要時間,在沒有彈出UIAlertController的時候吱瘩,用戶可能會進入其他的頁面就回導(dǎo)致以下的兩個問題道伟。
Presenting view controllers on detached view controllers is discouraged
當(dāng)用戶在沒有彈出提醒框的時候,push進入了下一個控制器使碾。雖然在下一個控制器可以彈出提醒框蜜徽,但是會報出這個警告。
這個警告的條件是需要彈出UIAlertController的控制器仍然在導(dǎo)航控制器的棧中票摇,但不是棧頂控制器拘鞋。Attempt to present whose view is not in the window hierarchy
這個警告和上個警告的區(qū)別在于,控制器已經(jīng)不在導(dǎo)航控制器的棧中了(用戶pop返回了上級頁面)矢门∨枭控制器已經(jīng)不在窗口的層級中了。
導(dǎo)致的問題:
雖然上面的問題不會讓程序崩潰,但是會讓以后項目的層級混亂,不易于維護.而且會導(dǎo)致控制器一直無法被銷毀.
解決方法:
- 可以使用蒙板祟剔,在提示框沒有展示之前隔躲,防止用戶點擊。
- 判斷導(dǎo)航控制器的棧頂控制器是否為當(dāng)前控制器
if ([self.navigationController.topViewController isMemberOfClass:[self class]]) {
[self presentViewController:alertC animated:YES completion:nil];
}
3.不要再viewDidLoad里面去modal一個控制器, 要將modal代碼放進viewDidAppear中,否則會導(dǎo)致Attempt to present whose view is not in the window hierarchy.
4.將modal代碼改為
[self.view.window.rootViewController presentViewController:viewController animated:YES completion:nil];
但是我認為這個方法治標(biāo)不治本.