iphone NavigationController清晰视图堆栈

时间:2012-06-06 23:28:21

标签: iphone view uinavigationcontroller stack clear

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

答案 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];
    }
}