iPhone导航控制器清空视图堆栈

3
我有一个使用导航控制器的iPhone应用程序。在该控制器中,我推送一些视图。在某些情况下,我想要“清空”视图堆栈,只保留导航控制器的rootViewController,然后推送另一个视图控制器。是否有人可以给我一个如何实现这个的示例?我没有看到任何清空堆栈的方法。

答案 1: 我尝试在按钮动作中放入以下代码:

[self.navigationController popToRootViewControllerAnimated:NO]; 

 do some stuff here to prepare for the push.

[self.navigationController pushViewController:self.myOtherController animated:YES];

但它只弹出到roorController,没有推出我想要的其他viewController。

我已经更新了我的答案。请看下面。 - The Kraken
啊,我现在明白了。我有一个解决方案,并且在接下来的几个小时内会更新我的答案,等我有时间了再做。 - The Kraken
我已经更新了我的答案,并附上了经过测试的代码。请见下文。 - The Kraken
4个回答

4

以下代码将允许用户向下浏览视图层次结构,并在按下按钮时弹回到根视图控制器并推出一个新视图。

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。因此,该视图控制器不再运行任何其他代码。使用上面的代码,导航堆栈将弹回到正在加载的同一视图控制器。

请检查上面的答案。 - Panos
当然,我已经分配并初始化了第二个视图控制器。当它弹回到根视图控制器时,似乎忽略了该方法中的其余代码。 - Panos
1
你很棒。尽管我需要进行一些更改以传递所需的参数,但它按照我想要的工作了。非常感谢我的朋友! - Panos

1

我想你正在寻找-popToRootViewControllerAnimated:


请参考上面查看我的回答。 - Panos

0
UIViewController* root = [self.navigationController.viewControllers objectAtIndex:0];

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

在哪里找到“cal”视图控制器。 但是没有动画。


0
除了The Kraken的答案,
请在要弹出的UIViewController中添加以下函数。
(void)viewDidDisappear:(BOOL)animated {

    [super viewDidDisappear:YES];

    for(UIView *view in self.view.subviews)
    {
       [view removeFromSuperview];
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接