2011-02-13 148 views
10

我想推視圖控制器到堆棧上,然後彈出第一個推新的。如何在推送的視圖控制器下彈出視圖控制器?

-(void) someMethod { 
    MegaSuperAwesomeViewController *tempVC = [[MegaSuperAwesomeViewController alloc] init]; 
    [self.navigationController pushViewController:tempVC animated:YES]; 
    [tempVC release]; 

    // pop this VC, how? 
} 

編輯:原來,曾經與新VC完成後,我可以彈回2個視圖控制器來代替。仍然不是我想要的,但它的工作原理。缺點是我需要設置一個標誌來指示已覆蓋的視圖已完成。

+0

爲什麼你wan't做到這一點? – 2011-02-13 18:07:06

+0

應用程序的要求。或者,我可以彈出當前的視圖控制器,然後推下一個,但當前視圖將在完成推送之前釋放。 – TigerCoding 2011-02-13 18:10:25

回答

16

這裏的彈出背面有兩個視圖控制器的技術,它具有當前視圖控制器及其navigationController屬性的你,只要你做的第一個彈出走開的一個類似的問題:

// pop back 2 controllers on the stack to the setup screen 
// 

// locally store the navigation controller since 
// self.navigationController will be nil once we are popped 
// 
UINavigationController *navController = self.navigationController; 

// retain ourselves so that the controller will still exist once it's popped off 
// 
[[self retain] autorelease]; 

// Pop back 2 controllers to the setup screen 
// 
[navController popViewControllerAnimated:NO]; 
[navController popViewControllerAnimated:YES]; 

或者,

setViewControllers:動畫:在視圖控制器的導航控制器堆棧可以直接「當事人」取代 目前導航控制器管理 與的視圖控制器指定項目。

  • (無效)setViewControllers:(NSArray的*)動畫viewControllers:(BOOL)動畫參數 viewControllers的視圖控制器 到堆疊放置。該陣列中控制器 的前後順序 代表導航堆棧中控制器 的新的 自下而上的順序。因此,添加到陣列的最後一項變爲 導航堆棧的頂部項目。 動畫如果是,則動畫推動 或彈出頂視圖控制器。 如果否,請在沒有任何動畫的情況下更換視圖控制器 。討論您可以使用此方法更新 或 替換當前視圖控制器 堆棧,而無需明確推送或彈出每個 控制器。此外, 此方法允許您更新控制器組 而不激活 更改,當您想要將導航控制器返回 以前的狀態時,此更改可能適用於啓動時間 。

如果動畫被啓用,該方法 決定過渡的這類型 進行基於項目陣列中的最後一個項目 是否已經在 導航堆棧。如果視圖 控制器當前處於堆棧中,但不是最上面的項目,則此 方法使用彈出轉換;如果視圖 控制器當前處於堆棧中,如果它是 最上面的項目,則不執行轉換 。如果視圖控制器 不在堆棧上,則此方法使用 推送轉換。只執行一個轉換 ,但是當轉換 完成時, 堆棧的全部內容將被替換爲新視圖 控制器。例如,如果 控制器A,B和C在 堆棧上並且您設置了控制器D,A, 和B,則此方法使用彈出窗口 轉換,並且生成的堆棧 包含控制器D,A和B 。

可用性在以後的iOS 3.0和 。宣佈 UINavigationController.h

因此,直接「消失」視圖控制器導航堆棧下您,在您的視圖控制器的viewDidLoad,你可以這樣做:

NSMutableArray *VCs = [self.navigationController.viewControllers mutableCopy]; 
[VCs removeObjectAtIndex:[VCs count] - 2]; 
self.navigationController.viewControllers = VCs; 
+0

感謝您的嘗試,但導航數組與您所描述的VC數組不兼容,因爲它必須是可變的。然而,這並不是真的需要,因爲我完成後可以從新的VC中彈出兩個VC。不知道爲什麼我沒有發現它。 – TigerCoding 2011-02-13 18:53:19

0

感謝Bogatyr約'navcontroller的viewcontroller數組'上的提示。我只是用我想更改的一個viewcontroller替換整個堆棧,然後註銷堆棧中的所有viewcontroller以確保它是唯一的一個!工作很好 - 謝謝!

RatingsTableViewController *newViewController = [[RatingsTableViewController alloc] init]; 
    NSMutableArray * newVCarray = [NSMutableArray arrayWithObjects:newViewController, nil]; 
    self.navigationController.viewControllers = newVCarray; 

    [newViewController release]; 

    NSMutableArray *allControllers = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers]; 

    for (id object in allControllers) { 

      NSLog(@"name VC: %@", object); 
    } 
    [allControllers release]; 
8

我很難弄清楚這一點,所以我想分享我如何得到這個工作。

比方說,你有風險投資VC1爲根的堆棧中,然後你把VC2VC2要推VC3但一旦推你不希望用戶回去VC2而是VC1(根)。做到這一點的方法是:

//push VC3 from VC2 
[[self navigationController] pushViewController:VC3 animated:YES]; 

// now remove VC2 from the view controllers array so we will jump straight back to VC1 
NSMutableArray *viewHeirarchy =[[NSMutableArray alloc] initWithArray:[self.navigationController viewControllers]]; 
[viewHeirarchy removeObject:self]; 
self.navigationController.viewControllers = viewHeirarchy; 

希望這有助於別人

0
-(void)popToSelf{ 

    NSArray *array = [self.navigationController viewControllers]; 

    for (int i = 0 ; i < array.count ; i++) { 
     UIViewController *currentVC = [array objectAtIndex:i]; 
     if ([currentVC isKindOfClass:[YourViewControllerClass class]]) { 
      [self.navigationController popToViewController:[array objectAtIndex:i] animated:YES]; 
     } 
    } 
} 
相關問題