从模态视图控制器返回到根视图控制器

12

从主页视图 - 根视图控制器 - 当用户在导航层次结构中向前移动时,我会依次打开2个视图控制器:

1)通过Storyboard中连接的按钮推出SecondViewController

2)以模态方式呈现ThirdViewController

[self performSegueWithIdentifier:@"NextViewController" sender:nil];

所以,情况是这样的:RootViewController -> SecondViewController -> ThirdViewController。

现在,在我的ThirdViewController中,我想要一个按钮可以返回2次到我的RootViewController,也就是回到主页。但是这并不起作用:

[self.navigationController popToRootViewControllerAnimated:YES]; 

只有这个人回到了第二个视图控制器

[self.navigationController popViewControllerAnimated:YES];

我如何同时移除模态视图控制器和推送视图控制器?


我认为你想要做的是在你的第三个视图控制器中:[self.presentingViewController dismissViewControllerAnimated:NO]; [self.presentingViewController popToRootViewControllerAnimated:YES];,不好意思打字不太好,我在用手机。 - powerj1984
可能是返回到根视图在IOS的重复问题。 - jww
3个回答

21
我曾遇到过一个类似的情况,我在导航控制器栈上推入了若干个视图控制器,然后呈现了最后一个视图控制器。在模态屏幕上,有一个取消按钮可以返回到根视图控制器。
在模态视图控制器中,当点击取消按钮时,会触发一个操作:
- (IBAction)cancel:(id)sender
{
    [self.delegate modalViewControllerDidCancel];
}

在这个模态视图控制器的头部,我声明了一个协议:
@protocol ModalViewControllerDelegate
- (void)modalViewControllerDidCancel;
@end

然后导航堆栈中的最后一个视图控制器(即呈现模态视图的控制器)应该实现ModalViewControllerDelegate协议:

- (void)modalViewControllerDidCancel
{
    [self dismissViewControllerAnimated:NO completion:nil];
    [self.navigationController popToRootViewControllerAnimated:YES];
}

上面的方法是重要的部分。它让呈现视图控制器关闭模态视图,然后弹回根视图控制器。请注意,我将NO传递给dismissViewControllerAnimated:,并将YES传递给popToRootViewControllerAnimated:,以获得从模态视图到根视图的更流畅的动画。


我正在测试你的解决方案。委托方式更复杂,但也许值得一试。 - Vad
你的回答帮了我很多。我只需要通过post通知来完成它,而不是使用delegate。 - Vad
最后,第一行是[self dismissModalViewControllerAnimated:NO];。 - Vad
@Vad,我很高兴你已经让它工作起来了。在iOS 6.0中,dismissModalViewControllerAnimated:方法已被弃用。现在推荐使用的方法是dismissViewControllerAnimated:completion: 在此处查看文档 - Steph Sharp
谢谢,我花了很多时间来解决一个类似的问题。什么都没用!!但是这个简单的解决方案解决了问题。 - feldeOne

4

很高兴知道这个,但必须支持iOS5 :( - Vad

0
假设您的AppDelegate被称为AppDelegate,那么您可以执行以下操作,将应用程序窗口的根视图控制器重置为视图RootViewController。
AppDelegate *appDel = (AppDelegate*)[[UIApplication sharedApplication] delegate];
RootViewController *rootView = [[RootViewController alloc] init];
[appDel.window setRootViewController:rootView];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接