如何在故事板中返回到根视图控制器?

7

我想做的事情看起来很简单,但是我在网上找不到任何答案。我将登录屏幕作为根视图控制器,然后是标签栏控制器,在每个标签中都有一个导航控制器。

我使用了故事板,层次结构如下所示:

Root VC
    |
     --- tabbar controller
          |
           ---Navigation Controller
                |
                 --- VC1

需求是从VC1导航回根视图控制器。我们如何实现这个目标?


2
你应该使用 unwind segue 来实现这个功能。 - rdelmar
谢谢你的回答@rdelmar,我同意你的解决方案。但是我现在面临的问题是,我无法将按钮插座连接到Storyboard的退出按钮以进行解绑。似乎它是不可访问的。你可以帮我解决一下吗? - Vinay Jain
看一下我在这里的答案(http://stackoverflow.com/questions/16158586/app-running-slow-after-loading-viewcontroller-then-unload-about-15-20-times/16160239#16160239),看看你是否尝试这样做。 - rdelmar
5个回答

3
我使用“Unwind Segues”方法解决了问题。
步骤1:您需要做的最少的工作是为目标视图子类化视图控制器(即,已经在导航中弹出并且您想要取消引用到该视图的视图),并添加像这样的方法(方法名称可以是任何您想要的名称,但应该是唯一的,因为您整个应用程序中的所有取消引用都会列在一起):
- (IBAction)unwindToViewControllerNameHere:(UIStoryboardSegue *)segue {
//nothing goes here
}

第二步)现在,在您的源视图中(也就是您想要解开的视图),您只需从按钮或其他控件拖动一个segue到源视图底部的绿色“EXIT”图标。现在应该有一个选项连接到“- unwindToViewControllerNameHere”。

就这样,当您的按钮被点击时,segue将解开。我们可以移动到任何我们想要的视图控制器,其余的视图控制器将被释放。


2
如果您的控制器层次结构如下:
--- 导航控制器 -- | 根视图控制器 | --- 标签栏控制器 | --- 导航控制器 -- | --- 视图控制器1
如果VC1上有一个UIButton,在单击它时,您想要移动到根视图控制器(Root VC),那么请使用以下代码:
-(void)moveToRootViewController {

    //Move to root viewController
    UINavigationController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"mainnav"];

    self.view.window.rootViewController = controller;

 }

这里的mainnav是根视图控制器导航控制器的故事板标识符。

ViewControllers hierarchy

根据图片,白色视图控制器是根视图控制器,选项卡栏有两个带有导航控制器的选项卡。如果您想从第二个选项卡视图控制器(黑色)单击 UIButton 后返回根视图控制器,则使用上面的代码。

如果您的层次结构如下: --- 导航控制器 -- | 根视图控制器 | --- VC1---- |--- VC2---- | 并且想要从VC1或VC2返回根视图控制器(Root VC),则使用:

[self.navigationController popToRootViewControllerAnimated:YES]; 

0
请使用以下代码。
- (void) forRootViewCon {
    UINavigationController *nav = (UINavigationController*) self.view.window.rootViewController;
    UIViewController *root = [nav.viewControllers objectAtIndex:0];
    [root performSelector:@selector(returnToRoot)];
}

调用的方法名是returnToRoot

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

OR

[self.navigationController popToRootViewControllerAnimated:YES];

0

这应该足够了。

[self.navigationController popToRootViewControllerAnimated:YES];

0

您应该在导航控制器中启用根视图控制器:

--- 导航控制器 -- | 根视图控制器 | --- 标签栏控制器 | --- 视图控制器1

然后调用

[navController popToRootViewControllerAnimated:YES];

编辑: 我猜您在将选项卡控制器包含在导航控制器中遇到了问题?


谢谢您的回答,但我想了解选项卡控制器中的导航。我认为像NavigationController -> TabBar Controller -> Navigation Controller这样的层次结构不是很好。苹果不会建议这样做。 - Vinay Jain
我在导航控制器中有一个根视图控制器,但我将其隐藏了。如何返回到根视图? - Gank

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