我有一个使用导航控制器的iphone应用程序。在那个控制器中我推了一些视图。在某些情况下,我想“清除”视图堆栈,只留下堆栈中导航控制器的rootViewController并推送另一个viewController。
有人能举例说明如何做到这一点吗?我没有看到任何清除堆栈的方法。
答案1: 我试图在按钮Action中输入以下代码:
[self.navigationController popToRootViewControllerAnimated:NO];
do some stuff here to prepare for the push.
[self.navigationController pushViewController:self.myOtherController animated:YES];
但它只会弹出到roorController。它没有推动我想要的其他viewController。
答案 0 :(得分:3)
以下代码将允许用户向下钻取视图层次结构,只需按一下按钮,就会弹回根视图控制器并推送新视图。
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。
你的初始代码没有完全执行的原因是因为在从DetailViewController调用-popToRootViewController:
之后,RootViewController的方法占用了主线程,并且DetailViewController被释放了。因此,没有从该视图控制器运行进一步的代码。使用上面的代码,导航堆栈将弹回到正在加载的同一个视图控制器。
答案 1 :(得分:1)
我认为你正在寻找-popToRootViewControllerAnimated:
答案 2 :(得分:0)
UIViewController* root = [self.navigationController.viewControllers objectAtIndex:0];
self.navigationController.viewControllers = [NSArray arrayWithObjects:root, cal, nil];
'cal'视图控制器去哪里。 但是没有动画。
答案 3 :(得分:0)
除 The Kraken 答案外,
在UIViewController中添加以下功能,您将要弹出它。
(void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:YES];
for(UIView *view in self.view.subviews)
{
[view removeFromSuperview];
}
}