我需要转到我的应用中的第一个视图。我有几个视图被推入堆栈然后一个模态导航控制器和更多的视图推到它。
我遇到的问题是使用[[self navigationController] popToRootViewControllerAnimated:YES];
只会回到模态堆栈中的第一个视图。
我无法让[[self navigationController] popToViewController:..
工作,因为[[self navigationController] viewControllers]
无法访问真正的第一个视图控制器。
关于如何实现这一目标的任何想法?感谢。
答案 0 :(得分:6)
这样做:
[[self navigationController] dismissModalViewControllerAnimated:YES];
这会让你回到模拟呈现导航控制器的VC。之后再往后走,取决于你如何在导航控制器之前推动那些“少量视图”。
编辑 - 解释以获得最深的根...
听起来就像那些“少数观点”在另一个底层导航控制器的堆栈上。这可能有点棘手,因为在该堆栈中获得更远的干净方法是让底层导航控制器弹出它自己的根。但是怎么知道它上面的模态VC已经完成了呢?
让我们调用执行第二个导航控制器VC_a的模态显示的视图控制器。它是一个模态呈现的导航控制器,其最顶层的VC是VC_b。当VC_b模态地解散自己时,VC_a如何知道弹出它的导航根?
好的答案(通常)是VC_b决定解雇自己是有原因的 - 你的app / model中的某些条件已经改变,以便决定完成。
我们也希望VC_a能够检测到这种情况。当VC_b被解雇时,VC_a会收到一条viewWillAppear消息,因为它即将被发现:
// VC_a.m
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if (/* some app condition that's true when VC_b is done */) {
// I must be appearing because VC_b is done, and I'm being uncovered
// That means I'm done, too. So pop...
[self.navigationController popToRootViewControllerAnimated:NO];
} else {
// I must be appearing for the normal reason, because I was just pushed onto the stack
}
}
答案 1 :(得分:0)
您需要使用delegation pattern来完成此操作。具体来说,通过创建实现委托的respondsToSelector
方法的协议。
有关完整详情,请参阅this post。它应该几乎正是你要找的。我不得不做类似的事情,除了我只需要从导航堆栈中弹出一个视图而不是使用popToRootViewControllerAnimated:
。
答案 2 :(得分:0)
在AppDelegate.m类中使用波纹管流程创建方法...
-(void)MethodName{//your method name
YourViewController *objViewController = [[[YourViewController alloc] initWithNibName:@"YourViewController" bundle:nil] autorelease]; ///define your viewcontroller name like "FirstViewController"
UINavigationController *yourNavigationController = [[[UINavigationController alloc] initWithRootViewController:objViewController] autorelease];
self.window.rootViewController = yourNavigationController;
}
当你想在firstview上重定向时,只需从appdelegate对象中调用此方法....
答案 3 :(得分:0)
对于iOS6 ......
[self.view.window.rootViewController dismissViewControllerAnimated:YES completion:nil];