11

Come si può passare a un altro controller di visualizzazione senza prepareForSegue?passare a un altro controller di visualizzazione senza preparareForSegue

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

risposta

45

Se si vuole invocare a livello di codice un segue spinta, si darà la segue un "id storyboard" in Interface Builder e quindi è possibile:

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

In alternativa, se non si desidera eseguire la segue , è possibile creare un'istanza del controller della vista di destinazione e quindi premere manualmente sul controller della vista. Tutto quello che dovete fare è quello di fare in modo che il controller della vista di destinazione ha il suo "storyboard id" in Interface Builder, allora si può:

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

lei ha detto "push" (e quindi ho usato pushViewController sopra). Se si intende veramente per "presentare un controller di vista modale", quindi che la seconda linea è:

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

Come si può vedere, non lo fai hanno utilizzare prepareForSegue spingere per nuova scena. Si utilizza prepareForSegue solo se si desidera passare le informazioni al controller di visualizzazione di destinazione. Altrimenti non è necessario.

Chiaramente, se non stai usando gli storyboard (ad es. Stai usando NIB), il processo è completamente diverso. Ma presumo che tu non stia usando NIB perché prepareForSegue non è applicabile in quell'ambiente. Ma se si sta utilizzando PUNTO, sarebbe la seguente:

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

Questa risposta è molto molto utile! – Plagorn

3

[self presentViewController:viewController animated:YES completion:nil]; non è necessaria, in quanto la segue spingerà il controller della vista di destinazione utilizzando la transizione selezionata automaticamente.

Se non si desidera utilizzare il processo segue è necessario spingere manualmente il controller della vista con:

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

ma assicurarsi di rimuovere i segues nello Storyboard prima.

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

Nel mio caso tutti viewControllers sono costruiti in modo dinamico. Non uso lo storyboard per questo scopo. Se questo è il tuo caso puoi semplicemente istanziare la classe viewController che vuoi aprire e fare una spinta come nel mio esempio qui sotto:

MyViewController* myViewController = [[MyViewController alloc] init]; 
[self.navigationController pushViewController:myViewController animated:YES]; 
Problemi correlati