【问题标题】:How do I segue from a NIB subview to a viewcontroller in the storyboard如何从 NIB 子视图转到情节提要中的视图控制器
【发布时间】:2013-08-16 16:45:52
【问题描述】:

我有一个故事板和 NIB 视图控制器的组合,我如何从一个到另一个切换

这是场景:

         UITabBarController(storyboard)|- UINavigationController (subclassed in storyboard) -> [UIViewController (NIB)] -> UIViewController (in Storyboard)

【问题讨论】:

  • 你发现了吗?

标签: ios storyboard segue nib


【解决方案1】:

您必须为情节提要中的UIViewController 提供一个“情节提要 ID”(在身份检查器选项卡中)。然后在您的 NIB ViewController 的代码中实例化该 ViewController,如下所示:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

ViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"YourViewControllerId"];
[self.navigationController pushViewController:vc animated:YES]; 

【讨论】:

    【解决方案2】:

    在您的 UINavigationController 子类中,您需要使用 NIB 中的视图实例化您的视图控制器(我们称之为 NIBViewController),并使用方法 setViewControllers:animated: 将该视图控制器设置为 rootViewController。在awakeFromNib 中这样做:

    - (void)awakeFromNib
    {
        [super awakeFromNib];
    
        NIBViewController *viewController = [[NIBViewController] init];// It will look for the appropriate XIB as long as you did not change its name and it's in the main bundle, otherwise use initWithNibName:bundle:
    
        [self setViewControllers:@[viewController] animated:NO];
    }
    

    然后,要从 NIBViewController 转到包含在情节提要中的其他视图控制器,只需在情节提要中为该视图控制器设置一个标识符,实例化它并根据需要推送或呈现它。

    重要的是要在您的 NIBViewController 实例中标记 self.storyboard 将为 nil,因为该视图控制器不包含在情节提要中,因此您需要实例化一个新情节提要(解决方案 A**)或从导航控制器(解决方案 B):

    // Solution A
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    
    // Solution B
    UIStoryboard *storyboard = [self.navigationController storyboard];
    
    UIViewController *storyboardViewController = [storyboard instantiateViewControllerWithIdentifier:@"viewControllerId"];
    
    [self.navigationController pushViewController:storyboardViewController animated:YES];
    

    ** 请注意,这是创建情节提要的新实例,因此最好不要尝试棘手的事情并避免与情节提要中包含的以前的视图控制器发生冲突,否则您会发现那些视图控制器不是同一个。 .. 这是我想到的第一个解决方案,但您绝对应该选择解决方案 B。

    【讨论】:

      猜你喜欢
      • 2017-07-08
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-12
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多