2012-11-07 28 views
3

我在一個叫的viewController和VCA我這樣做:self.navigationController pushViewController不加控制堆棧

[self.navigationController pushViewController:vcB animated:YES]; 

和它的作品。 vcB被推送。裏面vcB的viewDidAppear我這樣做:

NSArray *controllers = self.navigationController.viewControllers; 

和控制器只包含一個對象,vcA !!!! (什麼?)

爲什麼vcB被添加到控制器陣列?有什麼可以防止這種情況發生嗎?

謝謝。

+0

你怎麼知道'controllers'只包含vcA?你是NSLog嗎?通過調試器觀察它可能會產生誤導。 –

+0

是的,我NSLog它。按下的控件不在列表中,只是推動它的那個... – SpaceDog

回答

7

爲了解決導航控制器棧上推視圖控制器的問題,我在牆上敲了一個星期。

問題是這樣的:我在一個導航控制的應用程序,我有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的事情正在發生,或者在這種情況下沒有發生。這裏最大的問題是這段代碼沒有崩潰,沒有錯誤信息,沒有,只是工作不好,但工作。

2

我相信這與您的檢查時間有關。在pushViewController方法中,下一個視圖控制器的viewWillAppear:方法(以及其他方法,例如正在檢查的方法)正處於調用過程中。我相信在所有這些方法被調用之後,在動畫完成之後,視圖控制器被視爲在導航棧上。

+0

好的,我點擊一個按鈕時修改了運行的方法。所以,現在控制器已經完全加載,問題依然存在。推送的控制器確實沒有被添加到導航堆棧中。 – SpaceDog

+0

這確實是我的問題,我完全以編程方式創建視圖控制器,導致在pushViewController之前調用viewDidLoad。 –

相關問題