11

prepareForSegueを使用せずに別のビューコントローラにどのようにプッシュできますか?セグエはあなたが自動的に選択された遷移を使用して宛先ビューコントローラをプッシュしますようprepareForSegueなしで別のビューコントローラにプッシュ

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];   
} 

答えて

45

、あなたはセグエにInterface Builderで「ストーリーボードID」を与え、その後、次のことができます。

[self performSegueWithIdentifier:"pushToMyVC" sender:self]; 

を別の方法として、あなたはセグエを実行しない場合宛先ビュー・コントローラーをインスタンス化し、手動でそのビュー・コントローラーにプッシュすることができます。あなたがやらなければならないことは、先のビューコントローラは、その後、あなたができる、Interface Builderで、独自の「ストーリーボードID」を持っていることを確認することです。

UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"DestinationController"]; 
[self.navigationController pushViewController:controller animated:YES]; 

あなたは「プッシュ」と述べた(ので、私は上記のpushViewControllerを使用しました)。あなたが本当に「モーダルビューコントローラを提示」を意味している場合、2番目の行があること:あなたが見ることができるように

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

、あなたはは、新しいシーンにプッシュするprepareForSegueを使用するを持っていません。宛先ビューコントローラに情報を渡す場合は、prepareForSegueを使用します。それ以外の場合は必要ありません。

明らかに、ストーリーボードを使用していない場合(例:NIBを使用している場合)は、プロセスが全く異なります。しかし、prepareForSegueはその環境には適用されないため、NIBを使用していないと仮定します。あなたはNIBを使用していた場合は、次のようにしかし、それは次のようになります。私の場合は

SecondViewController *controller = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil]; 
[self.navigationController pushViewController:controller animated:YES]; 
+0

この回答は非常に便利です! – Plagorn

3

[self presentViewController:viewController animated:YES completion:nil];は、必要とされていません。

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

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

が、あなたが最初のストーリーボードにseguesを削除してください。あなたがプログラムでプッシュセグエを起動したい場合は

0
NSString * storyboardName = @"Main"; 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil]; 
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewControllerID"]; 
    [self presentViewController:vc animated:YES completion:nil]; 
0

すべてviewControllersが動的に構築されています。私はこの目的のためにストーリーボードを利用していません。これがあなたのケースである場合は、私の下の例のように、開いてプッシュするviewControllerクラスをインスタンス化するだけです。

MyViewController* myViewController = [[MyViewController alloc] init]; 
[self.navigationController pushViewController:myViewController animated:YES]; 
関連する問題