web-dev-qa-db-fra.com

pousser vers un autre contrôleur de vue sans prepareForSegue

Comment pouvez-vous pousser vers un autre contrôleur de vue sans 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];        
}
11
Marius Behrens

Si vous souhaitez invoquer par programme une séquence Push, vous lui attribuez un "id de storyboard" dans Interface Builder, puis vous pouvez:

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

Sinon, si vous ne souhaitez pas effectuer la séquence, vous pouvez instancier le contrôleur de vue de destination, puis appuyer manuellement sur ce contrôleur de vue. Tout ce que vous avez à faire est de vous assurer que le contrôleur de vue de destination a son propre "id de storyboard" dans Interface Builder. Vous pouvez alors:

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

Vous avez dit "Push" (et j'ai donc utilisé pushViewController ci-dessus). Si vous vouliez vraiment "présenter un contrôleur de vue modale", cette deuxième ligne est la suivante:

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

Comme vous pouvez le constater, vous n'avez pas have pour utiliser prepareForSegue to Push to new scene. Vous utilisez uniquement prepareForSegue si vous souhaitez transmettre des informations au contrôleur de vue de destination. Sinon, ce n'est pas nécessaire.

Il est clair que si vous n'utilisez pas de storyboards (par exemple, vous utilisez des cartes d'interface réseau), le processus est totalement différent. Mais je suppose que vous n'utilisez pas de NIB car prepareForSegue n'est pas applicable dans cet environnement. Mais si vous utilisiez NIB, ce serait comme suit:

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

[self presentViewController:viewController animated:YES completion:nil]; n'est pas nécessaire, car le segue poussera le contrôleur de vue de destination en utilisant la transition que vous avez sélectionnée automatiquement.

Si vous ne souhaitez pas utiliser le processus segue, vous devez manuellement pousser le contrôleur de vue avec:

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

mais assurez-vous d’abord de supprimer les segments dans le Storyboard.

3
Richard Brown

Dans mon cas, tous les viewControllers sont construits de manière dynamique. Je ne me sers pas du storyboard à cette fin. Si tel est votre cas, vous pouvez simplement instancier la classe viewController que vous souhaitez ouvrir et créer un Push, comme dans mon exemple ci-dessous:

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