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