prepareForSegue
なしで別のView Controllerにプッシュするにはどうすればよいですか?
myClassVC *viewController = [myClassVC alloc];
UIStoryboardSegue *segue = [[UIStoryboardSegue alloc] initWithIdentifier:@"pushToMyVC" source:self destination:viewController];
if ([segue.identifier isEqualToString:@"pushToMyVC"]) {
NSLog(@"logging");
myClassVC *viewController = (myClassVC *)[segue destinationViewController];
[self presentViewController:viewController animated:YES completion:nil];
}
プログラムでPushセグエを呼び出す場合は、Interface Builderでセグエに「ストーリーボードID」を指定すると、次のことができます。
[self performSegueWithIdentifier:"pushToMyVC" sender:self];
または、セグエを実行したくない場合は、宛先のビューコントローラーをインスタンス化してから、そのビューコントローラーに手動でプッシュできます。あなたがする必要があるのは、Interface Builderで目的のView Controllerが独自の「ストーリーボードID」を持っていることを確認することだけです、そしてあなたは次のことができます:
UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"DestinationController"];
[self.navigationController pushViewController:controller animated:YES];
あなたは「プッシュ」と言った(したがって、上記のpushViewController
を使用した)。 「モーダルビューコントローラーを表示する」ことを本当に意図している場合、その2行目は次のようになります。
[self presentViewController:controller animated:YES completion:nil];
ご覧のとおり、prepareForSegue
を使用して新しいシーンにプッシュするのはhaveではありません。目的のビューコントローラに情報を渡したい場合にのみ、prepareForSegue
を使用します。それ以外の場合は必要ありません。
明らかに、ストーリーボードを使用していない場合(たとえば、NIBを使用している場合)、プロセスはまったく異なります。しかし、prepareForSegue
はその環境では使用できないため、NIBを使用していないと思います。しかし、NIBを使用している場合は、次のようになります。
SecondViewController *controller = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
[self.navigationController pushViewController:controller animated:YES];
[self presentViewController:viewController animated:YES completion:nil];
は必要ありません。セグエが自動的に選択した遷移を使用して目的のビューコントローラをプッシュするためです。
segue
プロセスを使用したくない場合は、手動でビューコントローラーをプッシュする必要があります。
[self presentViewController:viewController animated:YES completion:nil];
ただし、最初にストーリーボードのセグエを削除してください。
私の場合、すべてのviewControllerは動的に構築されます。私はこの目的でストーリーボードを利用しません。これが当てはまる場合は、開きたいviewControllerクラスをインスタンス化して、以下の例のようにPushを実行します。
MyViewController* myViewController = [[MyViewController alloc] init];
[self.navigationController pushViewController:myViewController animated:YES];
NSString * storyboardName = @"Main";
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewControllerID"];
[self presentViewController:vc animated:YES completion:nil];