2

ストーリーボードと NIB ビューコントローラーの組み合わせがあります。

これはシナリオです:

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

2 に答える 2

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 に答える