2

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

这是场景:

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

2 回答 2

2

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

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

ViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"YourViewControllerId"];
[self.navigationController pushViewController:vc animated:YES]; 
于 2013-08-14T16:28:10.470 回答
1

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

于 2013-08-14T17:07:55.623 回答