我有一个使用导航控制器的iPhone应用程序。 在该控制器我推的一些看法。 在某些情况下,我想“清除”的意见堆栈,只留在堆栈中的导航控制器的RootViewController的推另一个的viewController我有。
能有人给我如何做到这一点的例子吗? 我不认为这会清除栈的任何方法。
答1:我曾试图把按钮动作下面的代码:
[self.navigationController popToRootViewControllerAnimated:NO];
do some stuff here to prepare for the push.
[self.navigationController pushViewController:self.myOtherController animated:YES];
但只弹出到roorController。 它不推其他的viewController我想要的。
下面的代码将允许用户向下钻取视图层次,并在按下按钮,弹出返回到根视图控制器和推的新视图。
DetailViewController.m〜从中视图控制器以清除导航堆栈:
- (IBAction)buttonPressed:(id)sender {
[[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"popBack" object:nil]];
}
上面的代码做一个呼叫NSNotificationCenter
,张贴通知,该RootViewController的可以听见反应。 但是,第一,RootViewController的必须注册才能收到通知。
RootViewController.m
- (void)viewDidLoad
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pushViews) name:@"popBack" object:nil];
[super viewDidLoad];
}
接下来,RootViewController的必须设置引用选择-pushViews
。
- (void)pushViews {
//Pop back to the root view controller
[self.navigationController popToRootViewControllerAnimated:NO];
//Allocate and init the new view controller to push to
NewViewController *newVC = [[NewViewController alloc] init];
//Push the new view controller
[self.navigationController pushViewController:newVC animated:YES];
}
可以肯定的是,当你调用-popToRootViewControllerAnimated:
你指定NO
动画。 启用动画会导致在导航栏动画打嗝和迷惑系统。 上面的代码,当调用,将清除导航堆栈,只留下RootViewController的,然后加入NewViewController。
您最初的代码没有完全执行的原因是因为打完电话后-popToRootViewController:
从你的DetailViewController,该RootViewController的的方法占据了主线程和DetailViewController被释放。 因此,没有进一步的代码被从该视图控制器运行。 使用上面的代码,导航堆栈弹出回到正在被加载相同的视图控制器。
我认为你正在寻找-popToRootViewControllerAnimated:
UIViewController* root = [self.navigationController.viewControllers objectAtIndex:0];
self.navigationController.viewControllers = [NSArray arrayWithObjects:root, cal, nil];
当“CAL”视图控制器中去。 但没有动画。
除了海怪的答案,
下面添加功能的UIViewController,这你都要跳出来了。
(void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:YES];
for(UIView *view in self.view.subviews)
{
[view removeFromSuperview];
}
}