2011-12-16 54 views
1

首先,我知道這個問題是以正向的方式提出的,但在這種情況下,我要求一種已經設計好導航控制器的倒退方式。有了這樣說......NavigationController後退跳過查看

我有一個UINavigationController有三個觀點:TableGet,並在在IB創建的順序Avail

在前進,我想從TableGetAvail,但是當我打Avail「後退」按鈕,我想跳過Get並直接回轉到Table。這可能嗎?如果是這樣,怎麼樣?

回答

9

我是這樣做的:

NSArray *VCs = [self.navigationController viewControllers]; 
[self.navigationController popToViewController:[VCs objectAtIndex:([VCs count] - 2)] animated:YES]; 

爲了能夠重寫導航控制器的你將不得不繼承UINavigationController的後退按鈕。看看本教程如何:http://www.hanspinckaers.com/custom-action-on-back-button-uinavigationcontroller

+0

然後突然有人(甚至你)更新項目,並刪除或添加新的風險投資進入導航控制器堆棧。而你的代碼將無法工作(在最好的情況下)。魔法數字總是邪惡的。 – slxl 2017-03-29 02:40:00

2

看看UINavigationController's-popToViewController:animated:-popToRootViewControllerAnimated:,這正是你所要求的。也就是說,他們將導航堆棧彈出回特定的視圖控制器或根視圖控制器。不過,您仍然需要攔截導航控制器的後退按鈕動作才能使用它們。

3

實現導航控制器的委託方法:

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated 

,將火在導航控制器堆棧的所有VC。 (放在VC這個代碼的導航控制器後,把< UINavigationControllerDelegate>在.h

你想要做的是更換整個導航控制器的堆棧沒有你想它刪除視圖控制器。由於它是一個非可變數組,因此在移除VC之前,必須將其轉換爲可變數組,然後移除VC,然後將導航控制器的堆棧替換爲調用[self.navigationController setViewControllers:newVCs animated:NO];。這是至關重要的部分。在加載完頁面後,您將替換堆棧,但由於您保留了VC,因此它仍然是堆棧中的第一項,因此對用戶沒有明顯的影響。只要你在堆棧上沒有很多VC,這不是一個昂貴的通話。

這裏是我做到了在委託方法:

//Remove list setup page if new list was created 
if ([self.navigationController topViewController].class == [ItemViewController class]) 
{ 
    NSArray *VCs = [self.navigationController viewControllers]; 

    if(((UITableViewController*)[VCs objectAtIndex:[VCs count]-2]).class == [NewCardTypeController class]) 
    { 
     NewCardTypeController *removedObject = [VCs objectAtIndex:[VCs count]-2]; 
     if(removedObject != nil) 
     { 
      NSMutableArray *newArray = [NSMutableArray arrayWithArray:VCs]; 
      [newArray removeObject:removedObject]; 
      NSArray *newVCs = [NSArray arrayWithArray:newArray]; 
      [self.navigationController setViewControllers:newVCs animated:NO]; 
     } 
    } 
} 
+0

順便說一下,其他答案不會執行的操作是保留正確的導航欄序列,並確保您的後退按鈕在轉換時將具有正確的動畫行爲,因爲您不會覆蓋它。 – Christine 2012-12-01 17:25:35

相關問題