以下代码将允许用户深入查看视图层次结构,并在按下按钮时弹回根视图控制器并推送新视图。
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 被释放。因此,没有从该视图控制器运行更多代码。使用上面的代码,导航堆栈弹回到正在加载的同一个视图控制器。