69

MainStoryBoard で、viewController を detailView にプッシュしたいのですが、次のエラーが発生します。

NSInvalidArgumentException'、理由:「ナビゲーション コントローラーのプッシュはサポートされていません」

ストーリーボードのviewControllerに識別子「JSA」IDを設定しました。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == 0) {
        SWSJSAViewController *viewController = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"JSA"];
        [self.navigationController pushViewController:viewController animated:YES];
    }
}
4

2 に答える 2

49

rmaddyがコメントで言ったように、ナビゲーション コントローラーをプッシュしようとしています。

ナビゲーション コントローラーを (presentViewController を介して、または childViewController として追加することができます) 提示し、ViewController をプッシュする必要があります。

于 2014-10-30T15:14:03.217 に答える
33

Navigation Controller のプッシュについて話すときは、それを提示したいと考える可能性が最も高いでしょう。

  1. UINavigationControllerの紹介

これは最も一般的な方法であり、ほとんどの場合に実行したい方法です。UINavigationControllerプッシュすることはできません。新しいルート ビュー コントローラーでのみ提示できます。

MyViewController* vc = [[MyViewController alloc]
      initWithNibName:@"MyController" bundle:nil];

UINavigationController *myNav = [[UINavigationController alloc] initWithRootViewController: vc];

[self presentViewController:myNav animated:YES completion:nil];

ここで行うことは、最初に を作成し、UINavigationController必要に応じUIViewControllerてそのルート コントローラーとして設定することです。


  1. UINavigationControllerのプッシュ

ViewController の階層があり、Navigation Controller を含む View Controller をプッシュする必要がある場合の手順は次のとおりです。

1) を含む ViewController をプッシュしUINavigationControllerます。

プッシュする UINavigationControllerには、まず のサブクラスを作成しますUIViewController。これは、あなたUINavigationControllerとそのコンテンツのラッパー/コンテナ クラスになります。

ContainerViewController* vc = [[ContainerViewController alloc] init];

2) UINavigationController を子ビュー コントローラーとして追加する

viewDidLoadコンテナー (インスタンス化したばかり) に、次のようなものを追加するだけです。

Objective-C

UINavigationController* myNav = [[UINavigationController alloc] initWithRootViewController: rootViewController];
[myNav willMoveToParentViewController:self];

myNav.view.frame = self.view.frame;  //Set a frame or constraints
[self.view addSubview:myNav.view];
[self addChildViewController: myNav];
[myNav didMoveToParentViewController:self];

スウィフト 4.2+

let childNavigation = UINavigationController(rootViewController: viewController)
childNavigation.willMove(toParent: self)
addChild(childNavigation)
childNavigation.view.frame = view.frame
view.addSubview(childNavigation.view)
childNavigation.didMove(toParent: self)

ここで行うことは、基本的にナビゲーション コントローラーをインスタンス化し、それを子コントローラーとしてラッパーに追加することです。それでおしまい。UINavigationController のプッシュに成功しました。

于 2017-10-25T09:29:02.003 に答える