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];
}
}
rmaddy のように、ナビゲーションコントローラーをプッシュしようとしているコメントで述べています。
(presentViewControllerを介して、またはchildViewControllerとして追加できる)Navigation Controllerを提示し、ViewControllersをプッシュする必要があります。
pushing Navigation Controllerについて話すとき、それは最も可能性の高いです。
これが最も一般的な方法であり、ほとんどの場合、これがあなたのやりたいことです。 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
をルートコントローラーとして設定することです。
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を正常にプッシュしました。