web-dev-qa-db-ja.com

prepareForSegueなしで別のビューコントローラにプッシュする

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];        
}
11
Marius Behrens

プログラムで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];
46
Rob

[self presentViewController:viewController animated:YES completion:nil];は必要ありません。セグエが自動的に選択した遷移を使用して目的のビューコントローラをプッシュするためです。

segueプロセスを使用したくない場合は、手動でビューコントローラーをプッシュする必要があります。

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

ただし、最初にストーリーボードのセグエを削除してください。

3
Richard Brown

私の場合、すべてのviewControllerは動的に構築されます。私はこの目的でストーリーボードを利用しません。これが当てはまる場合は、開きたいviewControllerクラスをインスタンス化して、以下の例のようにPushを実行します。

MyViewController* myViewController = [[MyViewController alloc] init];
[self.navigationController pushViewController:myViewController animated:YES];
0
Mig70
   NSString * storyboardName = @"Main";
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewControllerID"];
    [self presentViewController:vc animated:YES completion:nil];
0
Naman Vaishnav