下面的代码将允许用户向下钻取视图层次,并在按下按钮,弹出回到根视图控制器,推动一个新的观点。
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被释放。因此,没有进一步的代码从该视图控制器运行。使用上面的代码,导航堆栈将弹出回到正在加载的相同视图控制器。
我已经更新了我的答案。见下文。 –
啊,我现在明白了。我有一个解决方案,并会在我有空的几个小时内更新我的答案。 –
我已经使用测试代码更新了我的答案。请看下面。 –