繁体   English   中英

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

[英]How do I pop the view controller underneath a pushed view controller?

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

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

    // pop this VC, how?
}

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

这是一种弹出两个视图控制器的技术,当你执行第一个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参数viewControllers要放置在堆栈中的视图控制器。 此阵列中控制器的前后顺序表示导航堆栈中控制器的新的从下到上的顺序。 因此,添加到数组的最后一项成为导航堆栈的顶部项。 动画如果是,则为顶视图控制器的推动或弹出设置动画。 如果为NO,则替换视图控制器而不使用任何动画。 讨论您可以使用此方法更新或替换当前视图控制器堆栈,而无需显式推送或弹出每个控制器。 此外,此方法允许您更新控制器集,而无需动画更改,这可能适用于您希望将导航控制器返回到先前状态的启动时间。

如果启用了动画,则此方法根据items数组中的最后一项是否已在导航堆栈中来决定执行哪种类型的转换。 如果视图控制器当前在堆栈中,但不是最顶层的项,则此方法使用弹出过渡; 如果它是最顶层的项目,则不执行转换。 如果视图控制器不在堆栈中,则此方法使用推送转换。 仅执行一次转换,但是当转换完成时,堆栈的全部内容将替换为新的视图控制器。 例如,如果控制器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;

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

假设您有一堆VC VC1作为root用户然后你推VC2VC2你想推VC3但是一旦推动你就不希望用户回到VC2而是回到VC1 (root)。 这样做的方法是:

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

希望这有助于其他人

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

感谢Bogatyr关于“控制器阵列上用于navcontroller的派对”的提示。 我只是用我想要更改的一个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];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM