2012-06-06 80 views
3

我有一个使用导航控制器的iphone应用程序。在该控制器中,我推动了一些观点。在某些情况下,我想“清除”视图堆栈,只留下堆栈中导航控制器的rootViewController并推送另一个viewController。iphone NavigationController清除视图堆栈

有人可以给我一个例子如何做到这一点?我没有看到清除堆栈的任何方法。


答1: 我曾尝试在按钮动作把下面的代码:

[self.navigationController popToRootViewControllerAnimated:NO]; 

do some stuff here to prepare for the push. 

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

但只弹出到roorController。它不会推我想要的其他viewController。

+0

我已经更新了我的答案。见下文。 –

+0

啊,我现在明白了。我有一个解决方案,并会在我有空的几个小时内更新我的答案。 –

+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被释放。因此,没有进一步的代码从该视图控制器运行。使用上面的代码,导航堆栈将弹出回到正在加载的相同视图控制器。

+0

请检查以上,看看我的答案。 – Panos

+0

当然,我已经分配并启动了第二个视图控制器。当它弹出到rootVC时,它似乎忽略了该方法中其余的代码。 – Panos

+1

你真是太棒了。虽然我需要进行一些更改才能传递我需要的参数,它的工作方式与我想要的一样。多谢了朋友! – Panos

1

我认为你正在寻找-popToRootViewControllerAnimated:

+0

请检查以上,看看我的答案。 – Panos

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

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

其中'cal'视图控制器去。 但没有动画。

0

除了海怪答案,

添加以下功能的UIViewController,这你都要跳出来了。

(void)viewDidDisappear:(BOOL)animated { 

    [super viewDidDisappear:YES]; 

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