webentwicklung-frage-antwort-db.com.de

wechseln Sie zu einem anderen Ansichtscontroller, ohneoreForSegue

Wie können Sie ohne prepareForSegue auf einen anderen View-Controller wechseln?

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

Wenn Sie ein Push-Segment programmgesteuert aufrufen möchten, geben Sie dem Segment eine "Storyboard-ID" im Interface Builder an. Anschließend können Sie:

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

Wenn Sie das Segue nicht ausführen möchten, können Sie alternativ den Ziel-View-Controller instanziieren und dann manuell auf diesen View-Controller drücken. Sie müssen nur sicherstellen, dass der Ziel-View-Controller im Interface Builder über eine eigene "Storyboard-ID" verfügt.

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

Sie sagten "Push" (und deshalb habe ich oben pushViewController verwendet). Wenn Sie wirklich "einen modalen View-Controller präsentieren" wollten, dann lautet die zweite Zeile:

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

Wie Sie sehen, haben Sie nicht , um prepareForSegue für Push in neue Szene zu verwenden. Sie verwenden prepareForSegue nur, wenn Sie Informationen an den Ziel-View-Controller übergeben möchten. Sonst ist es nicht nötig.

Wenn Sie keine Storyboards verwenden (z. B. NIBs), ist der Prozess völlig anders. Ich nehme jedoch an, dass Sie keine NIBs verwenden, da prepareForSegue in dieser Umgebung nicht anwendbar ist. Wenn Sie jedoch NIB verwenden, würde dies folgendermaßen aussehen:

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

[self presentViewController:viewController animated:YES completion:nil]; ist nicht erforderlich, da das Segue den Zielansicht-Controller mit dem von Ihnen ausgewählten Übergang automatisch pushen lässt.

Wenn Sie den segue-Prozess nicht verwenden möchten, müssen Sie den View-Controller manuell mit:

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

stellen Sie jedoch sicher, dass Sie zuerst die Segmente im Storyboard entfernen.

3
Richard Brown

In meinem Fall werden alle viewControllers dynamisch erstellt. Ich verwende das Storyboard nicht für diesen Zweck. In diesem Fall instanziieren Sie möglicherweise die viewController-Klasse, die Sie öffnen möchten, und machen Sie einen Push wie in meinem Beispiel unten:

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