我想将一个视图控制器推入堆栈,然后弹出第一个推动新控件的人。
-(void) someMethod {
MegaSuperAwesomeViewController *tempVC = [[MegaSuperAwesomeViewController alloc] init];
[self.navigationController pushViewController:tempVC animated:YES];
[tempVC release];
// pop this VC, how?
}
编辑:事实证明,一旦完成了新的VC,我就可以弹出2个视图控制器。仍然不是我想要的,但它的确有效。缺点是我需要设置一个标志来表明覆盖的视图已经完成。
答案 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];
}
}
}