一:問題出現(xiàn)的步驟:
我app的架構(gòu)是一個常見的三級控制器:
UITabbarController--->四個NavigationController--->四個UIViewController作為四大主頁;其中有一個視圖控制器A;
視圖控制器A的配置 ?:
首先:需求原因,我在viewWillAppear方法中有一個網(wǎng)絡(luò)請求,也即是每次視圖出現(xiàn)都會走這個網(wǎng)絡(luò)請求;
其次:視圖控制器A 有一個按鈕需要Push到一個視圖控制器B,而視圖控制器B則不需要tabbar我們調(diào)用了 [VcB setHidesBottomBarWhenPushed :YES]方法;正常情況沒有問題,可以正常隱藏tabbar;
問題出現(xiàn)的過程:
把手機網(wǎng)絡(luò)調(diào)整為very bad network ?也就是弱網(wǎng)模式; 然后進(jìn)行如下操作:進(jìn)入視圖控制器A-->push視圖控制器B----->****重點1:返回視圖控制器A****---->****重點2:再次push視圖控制器B****.........重復(fù)下去;
如果你的網(wǎng)絡(luò)夠慢,手速夠快在 重點1 這一步的時候,由于返回視圖控制器A ,有一個網(wǎng)絡(luò)請求發(fā)出去了,還沒返回,您就已經(jīng)到了重點2 這一步,也就是進(jìn)入了視圖控制器B; 當(dāng)視圖控制器A的網(wǎng)絡(luò)請求返回的時候,就會把視圖控制器B已經(jīng)隱藏的tabbar 再次顯示出來.
二:問題猜測
想著既然視圖控制器A的網(wǎng)絡(luò)請求返回了數(shù)據(jù),那么這些數(shù)據(jù)就需要視圖控制器A來進(jìn)行處理,但是此時視圖控制器B在堆棧的最頂端,也就是說,視圖控制器A不是顯示狀態(tài),他要處理數(shù)據(jù),所以就把Tabbar顯示出來了?
但是為什么會把tabbar顯示出來,我也沒想明白,只能聯(lián)想到響應(yīng)者鏈了,頂端的控件處理不了,就傳遞給父級控件,這樣一來就傳遞給了UITabbarController 所以tabbar就顯示出來了.(注意:這僅僅是猜測,不能當(dāng)真,也請知情的大神指點小弟)
三:解決辦法
根據(jù)上面的猜想,我做了如下處理,問題解決了:
在視圖控制器A的網(wǎng)絡(luò)請求回調(diào)Block中的第一行寫了這樣一句代碼(我用的是AFN):
if (self.navigationController.visibleViewController != self){ ? //self表示視圖控制器A
? ? ? ?return ;
}
也就是說self不是可視狀態(tài),那么久不處理數(shù)據(jù)