我需要转到应用程序中的第一个视图。我有一些视图被推到堆栈上,然后是一个模式导航控制器,还有更多的视图被推到上面。
我遇到的问题是,使用[[self navigationController] popToRootViewControllerAnimated:YES];只能返回到模式堆栈中的第一个视图。
而且我无法使用[[self navigationController] viewControllers]访问真正的first view控制器,所以无法使用[[self navigationController] popToViewController:..。
对于如何实现这一点有什么想法吗?谢谢。
发布于 2012-04-14 05:16:38
执行以下操作:
[[self navigationController] dismissModalViewControllerAnimated:YES];这将使您返回到以模态方式呈现导航控制器的VC。在此之后的更远取决于您如何在导航控制器之前推送这些“几个视图”。
编辑-解释以获得最深的根...
这听起来像是“几个视图”在另一个底层导航控制器的堆栈上。这可能有点棘手,因为更深入堆栈的干净方法是让底层导航控制器弹出到它自己的根目录。但是它怎么知道它上面的模态VC已经完成了呢?
让我们将第二个导航控制器VC_a的模式表示称为视图控制器。它是一个以模态表示的导航控制器,其最上面的VC是VC_b。当VC_b以模态方式忽略自己时,VC_a如何知道弹出到它的导航根?
好的答案(通常)是VC_b决定放弃自己是有原因的--你的应用程序/模型中的一些条件发生了变化,让它决定这样做。
我们希望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
}
}发布于 2012-04-14 05:35:44
您需要使用delegation pattern来完成此操作。具体地说,通过创建实现委托的respondsToSelector方法的协议。
有关完整的详细信息,请参阅this post。它应该几乎就是你正在寻找的东西。我不得不做一些类似的事情,只是我只需要从导航堆栈中弹出一个视图,而不是使用popToRootViewControllerAnimated:。
发布于 2012-04-14 20:30:35
在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对象调用此方法即可。
https://stackoverflow.com/questions/10148244
复制相似问题