2014-04-12 121 views
0

推視圖控制器後後退按鈕不回去

UIViewController *vc = [[self storyboard] instantiateViewControllerWithIdentifier:@"frontCardViewController"]; 
[self.navigationController pushViewController:vc animated:YES]; 

我刪除所有ViewControllers我不需要再使用此代碼

NSMutableArray *navigationArray = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers]; 
NSArray *array = [[NSArray alloc] initWithArray:navigationArray]; 
for (UIViewController *viewController in array) { 
    if ([viewController isKindOfClass:[RITCardViewController class]]) { 
      RSLog(@"Is kind of Class RITCardViewController"); 
      [navigationArray removeObject:viewController]; 
    } 
} 
self.navigationController.viewControllers = navigationArray; 

導航陣列現在看起來像這個:

"RITMainViewController: 0x10d81fc1>", 
"RITDetailViewController: 0x10d847880", 
"RITTestResultViewController: 0x113d0e090" 

但問題是,如果現在按導航欄中的後退按鈕,它回到第二個屏幕。但是當後退按鈕再次按下時,它只會停留在此屏幕上。它似乎通過我已經刪除的所有屏幕,但不顯示它們。

我在做什麼錯?

+1

導航控制器的要點是將新控制器推入堆棧,並允許用戶通過點擊後退按鈕返回堆棧。你永遠不應該手動刪除那些不再可見的。 從導航堆棧中移除控制器永遠不會工作;你正在腐蝕它的內部狀態,它肯定會變得無望地混淆。這也會產生糟糕的用戶體驗;人們期望導航能夠以他們習慣的方式工作。 – davidf2281

+0

@ davidf2281你錯在認爲它破壞了內部狀態。過去我做得很成功。然而,您在強調應用程序的用戶體驗時非常正確。 – bsarrazin

+1

我同意@ bensarz的建議。但是,根據acutal導航邏輯,使用'popToViewController:animated:'可能是一個選項。 –

回答

3

嘗試這樣代替:

NSMutableArray *viewControllers = [@[] mutableCopy]; 
for (UIViewController *vc in self.nagivationController.viewControllers) 
{ 
    if (NO == [vc isKindOfClass:[RITCardViewController class]]) 
     [viewControllers addObject:vc]; 
} 
self.navigationController.viewControllers = viewControllers; 

確保您通過刪除您目前從視圖控制器陣列的視圖控制器不會破壞堆棧。假設你當前的視圖控制器不是RITCardViewController的實例,你應該沒問題。否則,你必須在你的代碼中彌補它。