【问题标题】:How to move back to the root view controller in storyboard?如何移回情节提要中的根视图控制器?
【发布时间】:2013-12-04 13:33:49
【问题描述】:

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

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

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

要求是从 VC1 导航回根视图控制器。我们怎样才能做到这一点?

【问题讨论】:

  • 你应该使用 unwind segue 来做到这一点。
  • 感谢您的回答@rdelmar,我同意您的解决方案。但我现在面临的问题是,我无法将按钮插座连接到故事板的退出按钮以展开它。它似乎无法访问。你能帮我解决这个问题吗?
  • 在此处查看我的答案 (stackoverflow.com/questions/16158586/…),看看您是否正在尝试这样做。

标签: ios iphone objective-c cocoa uistoryboard


【解决方案1】:

我使用“Unwind Segues”解决了这些问题。

第 1 步)您需要的最低限度是为您的目标视图(也就是之前在导航中弹出的视图并且您想要展开它)子类化视图控制器,并向其添加这样的方法(方法名称可以是任何您想要的名称,但它应该是唯一的,因为您的整个应用程序中的所有展开转场都列在一起):

- (IBAction)unwindToViewControllerNameHere:(UIStoryboardSegue *)segue {
//nothing goes here
}

第 2 步)现在,在您的源视图(也就是您想要从中放松的视图)中,您只需将一个 segue 从您的按钮或其他任何东西拖到源视图底部的绿色小“EXIT”图标.现在应该有一个连接到“- unwindToViewControllerNameHere”的选项

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

【讨论】:

    【解决方案2】:

    如果你有类似的控制器层次结构

    --- 导航控制器 -- |根VC | --- 标签栏控制器 | --- 导航控制器 -- | --- VC1

    VC1 上有一个UIButton,所以点击你想移动到根视图控制器(根 VC)然后使用:

    -(void)moveToRootViewController {
    
        //Move to root viewController
        UINavigationController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"mainnav"];
    
        self.view.window.rootViewController = controller;
    
     }
    

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

    根据图片白色视图控制器是一个根视图控制器,tabBarController 有 2 个带有导航控制器的选项卡,如果您想从第二个选项卡视图控制器 UIButton(黑色) 移动到根视图控制器,请单击然后使用上面的代码。

    如果你有像这样的层次结构 --- 导航控制器 -- |根VC | --- VC1---- |--- VC2---- |

    并想从 VC1 或 VC2 移动到根视图控制器(根 VC)然后使用:

    [self.navigationController popToRootViewControllerAnimated:YES]; 
    

    【讨论】:

      【解决方案3】:

      这应该足够了。

      [self.navigationController popToRootViewControllerAnimated:YES];
      

      【讨论】:

        【解决方案4】:

        使用以下代码

        - (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];
        }
        

        [self.navigationController popToRootViewControllerAnimated:YES];
        

        【讨论】:

          【解决方案5】:

          您应该在导航控制器中启用 Root VC:

          --- 导航控制器 -- |根VC | --- 标签栏控制器 | --- VC1

          然后调用

          [navController popToRootViewControllerAnimated:YES];
          

          编辑: 我猜你有问题,包括导航控制器中的 tabBar 控制器?

          【讨论】:

          • 感谢您的回答,但我想了解标签栏控制器中的导航。我认为拥有像 NavigationController -> tabbar controller -> Navigation controller 这样的层次结构并不好。 Apple 不会建议这样做。
          • 我在导航控制器中有一个 Root VC,但我隐藏了它。如何进入根视图?
          猜你喜欢
          • 2019-12-04
          • 1970-01-01
          • 2013-06-21
          • 1970-01-01
          • 2011-12-23
          • 2014-08-12
          • 2012-11-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多