爲了解決導航控制器棧上推視圖控制器的問題,我在牆上敲了一個星期。
問題是這樣的:我在一個導航控制的應用程序,我有3個視圖控制器,vA,vB和vC。
我用的是從vA型推VB的這個:
[self.navigationController pushViewController:vB animated:YES];
它的工作,但是,當我試圖從VB推VC,VB的self.navigationController財產是零和VB並不在導航控制器堆棧。什麼?是的,我把vB放在導航棧上,vB沒有被添加到它,但即便如此,vB也顯示正確。
我發現在vB的viewDidLoad中,self.navigationController不是零,並且vB在導航控制器堆棧中,但是一旦vB的viewDidLoad結束,vB已從導航控制器堆棧中移除,並且其navigationController屬性被設置爲零。那時候,vB是一種幽靈控制,在導航控制器棧之外。
我不需要從vB中提到我無法回到vA或推送vC。
這是怎麼發生的?
簡單,我推VB的從塊內......這樣的:
void (^ block1)() = ^(){
[self.navigationController pushViewController:vB animated:YES];
};
發生了什麼事,因爲UIKit的功能(推的東西)在這可能是運行在塊被執行一個不是主線程的線程。
的決議,這是包裹在一個調度主線程的推動下,使用此:
void (^ block1)() = ^(){
dispatch_async(dispatch_get_main_queue(),
^{
[self.navigationController pushViewController:vB animated:YES];
});
};
該應用程序必須有連接的viewController錯誤的插座另一個小問題,但這是主要問題。這是一個難以發現的問題,因爲它很微妙。當我向導航欄中添加另一個按鈕並且該按鈕沒有出現時,我發現了這個問題。所以,我懷疑涉及UIKit的事情正在發生,或者在這種情況下沒有發生。這裏最大的問題是這段代碼沒有崩潰,沒有錯誤信息,沒有,只是工作不好,但工作。
你怎麼知道'controllers'只包含vcA?你是NSLog嗎?通過調試器觀察它可能會產生誤導。 –
是的,我NSLog它。按下的控件不在列表中,只是推動它的那個... – SpaceDog