3

我有一个使用导航控制器的 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。

4

4 回答 4

4

以下代码将允许用户深入查看视图层次结构,并在按下按钮时弹回根视图控制器并推送新视图。

DetailViewController.m ~ 要从中清除导航堆栈的视图控制器:

- (IBAction)buttonPressed:(id)sender {
    [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"popBack" object:nil]];
}

上面的代码调用NSNotificationCenter,发布一个通知,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 被释放。因此,没有从该视图控制器运行更多代码。使用上面的代码,导航堆栈弹回到正在加载的同一个视图控制器。

于 2012-06-06T23:35:51.530 回答
1

我想你正在寻找-popToRootViewControllerAnimated:

于 2012-06-06T23:31:05.670 回答
0
UIViewController* root = [self.navigationController.viewControllers objectAtIndex:0];

self.navigationController.viewControllers = [NSArray arrayWithObjects:root, cal, nil];

'cal' 视图控制器要去哪里。但是没有动画。

于 2012-08-31T09:02:14.617 回答
0

除了海妖的答案,

在 UIViewController 中添加以下函数,您将要弹出该函数。

(void)viewDidDisappear:(BOOL)animated {

    [super viewDidDisappear:YES];

    for(UIView *view in self.view.subviews)
    {
       [view removeFromSuperview];
    }
}
于 2014-03-10T06:58:26.753 回答