11

Jak można przekazać do innego kontrolera widoku bez numeru prepareForSegue?Przesyłanie do innego kontrolera widoku bez przygotowaniaForSegue

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

Odpowiedz

45

Jeśli chcesz programowo wywołać segue Push, dać Segue się „id” storyboard interfejs Builder, a następnie można:

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

Ewentualnie, jeśli nie chcesz, aby wykonać segue , można utworzyć instancję docelowego kontrolera widoku, a następnie ręcznie przesłać do tego kontrolera widoku. Wszystko, co musisz zrobić, to upewnić się, że kontroler widok docelowy ma swój własny „id storyboard” Interface Builder, a następnie można:

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

Mówiłeś „push” (a więc użyłem pushViewController powyżej). Jeśli naprawdę oznaczało by „przedstawić kontroler modalne widoku”, a następnie, że druga linia jest:

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

Jak widać, nie zrobić mieć używać prepareForSegue pchnąć do nowej sceny. Używasz tylko prepareForSegue, jeśli chcesz przekazać informacje do kontrolera widoku docelowego. W przeciwnym razie nie jest to konieczne.

Oczywiście, jeśli nie używasz scenorysów (np. Używasz NIB-ów), proces jest zupełnie inny. Ale zakładam, że nie używasz NIB, ponieważ prepareForSegue nie ma zastosowania w tym środowisku. Ale jeśli uzywasz NIB, byłoby to w następujący sposób:

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

Ta odpowiedź jest bardzo przydatna! – Plagorn

3

[self presentViewController:viewController animated:YES completion:nil]; nie jest potrzebna, ponieważ segue pchnie kontroler widok docelowy za pomocą przejścia wybrany automatycznie.

Jeśli nie chcesz korzystać z procesu segue musisz ręcznie wcisnąć kontroler widok z:

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

ale upewnij się usunąć segues w Planie pierwszy.

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

W moim przypadku wszystkie viewControllers zbudowane są dynamicznie. W tym celu nie używam scenorysu. W takim przypadku możesz po prostu utworzyć instancję klasy viewController, którą chcesz otworzyć, i wykonać wciśnięcie, jak w poniższym przykładzie:

MyViewController* myViewController = [[MyViewController alloc] init]; 
[self.navigationController pushViewController:myViewController animated:YES]; 
Powiązane problemy