ストーリーボードと NIB ビューコントローラーの組み合わせがあります。
これはシナリオです:
UITabBarController(storyboard)|- UINavigationController (subclassed in storyboard) -> [UIViewController (NIB)] -> UIViewController (in Storyboard)
ストーリーボードと NIB ビューコントローラーの組み合わせがあります。
これはシナリオです:
UITabBarController(storyboard)|- UINavigationController (subclassed in storyboard) -> [UIViewController (NIB)] -> UIViewController (in Storyboard)
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を選択する必要があります.