2014-03-25 149 views
1

我有問題嘗試從ios應用操縱導航堆棧。或者至少是因爲這種操縱的行爲。ios導航堆棧操作

我的情況:

我有3個ViewControllers。

控制器一個示出了多個級別, 控制器b是gameview 控制器C是某種得分

顯然我將選擇在控制器中的一個電平,這將觸發一個SEGUE到控制器B,一旦水平是完成對控制器的不合格賽格。每一次都是推動。

現在一旦我在控制器c我不希望能夠回到b使用後退按鈕。我想回到控制器a。爲了這個工作,我從堆棧中刪除了控制器,所以不會移動到控制器b。這工作正常。

im面臨的問題是,控制器a上顯示的後退按鈕,看起來不應該有任何迴應。如果我點擊後退按鈕,應用程序不會崩潰,按鈕就會消失,離開標題。

我嘗試添加:

NSArray* controllers = [self.navigationController viewControllers]; 

    if ([controllers count]<=1) { 
     [self.navigationItem setHidesBackButton:YES animated:YES]; 
    } else { 
     [self.navigationItem setHidesBackButton:NO animated:YES]; 
    } 
    [super viewDidAppear:animated]; 

在一些相對計算器文章建議,但沒有成功。除此之外,這看起來不像ios創建Storyboard中的那些按鈕,而實際上並沒有添加它們,但是當它們不再需要時,它們不會刪除它們。這給我留下了一些選擇。

  • 任我認爲,IOS是聰明比它實際上是
  • 我缺少一些重要的更新導航欄
  • 我去這一切都錯了

besdies即時通訊使用此代碼剪斷從控制器b切換到c。

[self performSegueWithIdentifier:@"feedbackSegue" sender:self]; 
[self removeFromParentViewController]; 

任何有關缺失操作或一般不良做法的提示都將不勝感激。

更新

經過進一步調查,它不只是後退按鈕,它的整個導航欄即關。它的行爲就像刪除的控制器仍然在那裏一樣。 BackButton在右端有另一個uiActionButton。

導航欄是否將其狀態存儲到不同的堆棧上,而不是視圖控制器?如果是這種情況,我可以從這個堆棧中移除該狀態,以保持一致。

回答

2

你可以在你的視圖控制器c中試試這個。這將刪除以前的視圖控制器,在你的情況下,b。你還不得不保持b在您的堆棧(刪除行[自removeFromParentViewController]「;)

-(void)viewDidAppear:(BOOL)animated{ 
    [super viewDidAppear:animated]; 
    if(self.navigationController.viewControllers.count>2){ 
     NSArray *controllers = self.navigationController.viewControllers; 
     NSMutableArray *newViewControllers = [NSMutableArray arrayWithArray:controllers]; 
     [newViewControllers removeObject:[controllers objectAtIndex:self.navigationController.viewControllers.count - 2]]; 
     self.navigationController.viewControllers = newViewControllers; 
    } 
} 
+0

這是我在做什麼,導致了同樣的問題。問題是我實際上回到了控制器b。它的控制器仍然顯示回來,即使無處可返回 –

+0

嗯,我沒有任何問題,一定要將它添加在viewDidAppear雖然。 – streem

+1

我在viewdidload中做了完全相同的事情。我不太清楚爲什麼它有所作爲,你是否刪除了以前的視圖控制器在didload或didappear(你可以點亮一些?),但它顯然是有區別的。謝謝。 –

1

我認爲‘正確’的方式做到這一點是要去除控制器C的後退按鈕。根據您如何以及何時移除控制器b,您可能會損壞導航控制器堆棧。操縱視圖控制器堆棧通常不是一個好習慣。

要刪除後退按鈕,你有正確的代碼:

self.navigationItem.hidesBackButton = YES; 

但是請注意,你必須給出視圖控制器之前調用此 - 就像viewDidLoad中即的東西。

當你想彈回給A,使用方法:

[self.navigationController popToRootViewControllerAnimated:YES]; 
+0

如果我要隱藏後退按鈕,我可以添加一個自己的按鈕,然後觸發poptorootviewcontroller。它看起來不會有什麼不同,但從我的頭頂來看它是一個可行的選擇。如果所有其他嘗試都失敗,那麼肯定會把它當作某種最終方法。謝謝,但我不知道這是不錯的做法。 ,如果我的做法不是很好,那麼什麼纔是實現所需控制器行爲的正確方法? –

+0

它看起來像設置您自己的自定義左欄按鈕的方式,將按照您所描述的方式看起來和後退按鈕的行爲。請參閱:http://stackoverflow.com/questions/1214965/setting-action-for-back-button-in-navigation-controller –

+0

但是,我認爲真正的問題是,有一個後退按鈕做你所描述的是打破導航控制器的流程 - 也就是說,您希望點擊回去做一些事情,而不是讓您回到前一個視圖控制器。我的建議是將彈出窗口添加到root vc功能,而不是後退按鈕。 –