如何在推送的视图控制器下弹出视图控制器?

时间:2011-02-13 17:53:40

标签: iphone ipad uiviewcontroller uinavigationcontroller ipod

我想将一个视图控制器推入堆栈,然后弹出第一个推动新控件的人。

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

    // pop this VC, how?
}

编辑:事实证明,一旦完成了新的VC,我就可以弹出2个视图控制器。仍然不是我想要的,但它的确有效。缺点是我需要设置一个标志来表明覆盖的视图已经完成。

4 个答案:

答案 0 :(得分:16)

这是一种弹出两个视图控制器的技术,当你执行第一个pop时,它与你当前的视图控制器及其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:animated:替换   目前管理的视图控制器   由导航控制器与   指定的项目。

     
      
  • (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated Parameters   viewControllers视图控制器   放在堆栈中。该   控制器的前后顺序   在这个数组中代表新的   控制器从下到上的顺序   在导航堆栈中。就这样   添加到数组的最后一项变为   导航堆栈的顶部项目。   动画如果是,则为推动设置动画   或弹出顶视图控制器。   如果为NO,请更换视图控制器   没有任何动画。讨论你   可以使用此方法更新或   替换当前的视图控制器   没有推动或弹出每个堆栈   控制器明确。此外,   此方法允许您更新该组   没有动画的控制器   变化,可能适合   您想要返回时的发布时间   导航控制器到   以前的状态。
  •   
     

如果启用了动画,则此方法   决定转换的类型   根据是否最后一项执行   在items数组中已经在   导航堆栈。如果是看法   控制器目前在堆栈中,   但这不是最重要的项目   方法使用pop转换;如果是   最顶层的项目,没有过渡   执行。如果视图控制器是   不在堆栈上,此方法使用a   推动转型。只有一个过渡   执行,但转移时   完成,整个内容   堆栈将替换为新视图   控制器。例如,如果   控制器A,B和C在上面   堆栈,你设置控制器D,A,   和B,这个方法使用pop   过渡和结果堆栈   包含控制器D,A和B.

     

可用性在iOS 3.0和   后来。宣告进入   UINavigationController.h

因此,要在导航堆栈上直接“消失”视图控制器,在视图控制器的viewDidLoad中,您可以这样做:

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

答案 1 :(得分:8)

我也很难搞清楚这一点,所以我想分享一下我是如何工作的。

假设您有一堆VC VC1 为根,然后您推送 VC2 ,并从 VC2 推送 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;

希望这有助于其他人

答案 2 :(得分:0)

感谢Bogatyr关于'导航控制器的视图控制器阵列上的派对'的提示。我只是用我想要更改的一个viewcontroller替换整个堆栈,然后注销堆栈中的所有viewcontrollers以确保它是唯一的!工作得很好 - 谢谢!

    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];

答案 3 :(得分: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];
        }
    }
}