web-dev-qa-db-ja.com

Navigation Controllerのプッシュはサポートされていません

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

NSInvalidArgumentException '、理由:' Navigation Controllerのプッシュはサポートされていません '

ストーリーボードの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];
    }
}
46
Jose

rmaddy のように、ナビゲーションコントローラーをプッシュしようとしているコメントで述べています。

(presentViewControllerを介して、またはchildViewControllerとして追加できる)Navigation Controllerを提示し、ViewControllersをプッシュする必要があります。

40
Tiago Almeida

pushing Navigation Controllerについて話すとき、それは最も可能性の高いです。

  1. PresentingUINavigationController

これが最も一般的な方法であり、ほとんどの場合、これがあなたのやりたいことです。 UINavigationControllerはプッシュできません。新しいルートView Controllerでのみ提示できます。

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

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

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

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


  1. PushingUINavigationController

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

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

PushUINavigationControllerに、最初にUIViewControllerのサブクラスを作成します。これは、ラッパー/コンテナ-クラスになりますUINavigationControllerとそのコンテンツ。

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

2)UINavigationControllerを子View Controllerとして追加

コンテナの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];

Swift 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)

ここで行うことは、基本的にNavigation Controllerをインスタンス化し、それを子コントローラーとしてラッパーに追加することです。それでおしまい。 UINavigationControllerを正常にプッシュしました

20
Hexfire