25

Używam metody presentViewController:animated:completion:, aby przejść do innego kontrolera widoku.System iOS: obecny program do kontrolowania widoku

To jest mój kod:

AddTaskViewController *add = [[AddTaskViewController alloc] init]; 
[self presentViewController:add animated:YES completion:nil]; 

Kod ten idzie do drugiej UIViewController ale drugi kontroler jest pusty. Zawsze używałem storyboardów, ale teraz potrzebuję tego zrobić w kodzie.

+1

To nie jest pytanie Xcode. Ponadto, nie mogłem wywnioskować, co masz na myśli mówiąc "drugi kontroler to nic", więc zostawiłem go w stanie nienaruszonym. –

Odpowiedz

38

Jeśli używasz scenorysu, prawdopodobnie nie powinieneś używać alloc i init do tworzenia nowego kontrolera widoku. Zamiast tego spójrz na swój scenorys i znajdź segue, który chcesz wykonać; powinien mieć unikalny identyfikator (a jeśli nie, możesz go ustawić na prawym pasku bocznym).

Po znalezieniu identyfikatora dla tego segue, wyślij swoją obecny kontroler Zobacz -performSegueWithIdentifier:sender wiadomość:

[self performSegueWithIdentifier:@"mySegueIdentifier" sender:self]; 

To spowoduje storyboard do instancję AddTaskViewController i przedstawia je w sposób, który "zdefiniowany dla tej segue.


Jeśli, z drugiej strony, nie używasz storyboard w ogóle, to trzeba dać AddTaskViewController jakiś interfejs użytkownika. Najczęstszym sposobem robić to jest inicjalizacja kontrolera w stalówkę: zamiast po prostu wywołanie init, zadzwonisz -initWithNibName:bundle: i podać nazwę .xib pliku, który zawiera interfejs dodatek zadanie:

AddTaskViewController *add = [[AddTaskViewController alloc] 
           initWithNibName:@"AddTaskView" bundle:nil]; 
[self presentViewController:add animated:YES completion:nil]; 

(Istnieją inne (rzadziej spotykane) sposoby uzyskiwania widoku skojarzonego z nowym kontrolerem widoku, ale prawdopodobnie będzie to miało najmniejsze problemy z działaniem.)

+0

Jeśli jest połączony z przyciskiem, to działa. ale nie jest połączone. – Salieh

+0

Jak zatem "odmówić" nowego kontrolera widoku w scenariuszu nieobsługiwania scenariusza? Szukam go, próbując znaleźć coś podobnego do unwindForSegue: towardsViewController: – matrixugly

+1

Właściwie znalazłem "dismissViewController", co według mnie jest właściwą odpowiedzią. – matrixugly

28

Jeśli używasz Storyboard i twojego "dodaj" viewController jest w scenorysie, a następnie ustaw identyfikator dla "dodaj" kontrolera view w ustawieniach, aby można było zrobić coś takiego:

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"NameOfYourStoryBoard" 
                bundle:nil]; 
AddTaskViewController *add = 
      [storyboard instantiateViewControllerWithIdentifier:@"viewControllerIdentifier"]; 

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

jeśli nie masz „dodaj” viewController w serii ujęć lub pliku nib i chcesz stworzyć całość programmaticaly następnie appDocs mówi:

Jeżeli nie można określić swoje poglądy w serii ujęć lub plik nib, zastąp metodę loadView, aby ręcznie utworzyć hierarchię widoków i przypisać ją do właściwości widoku.

-1

Oto jak można to zrobić w Swift:

let vc = UIViewController() 
self.presentViewController(vc, animated: true, completion: nil) 
+0

To tylko ładuje pusty UIViewController –

+4

, oczywiście, że tak. Musisz go zastąpić własnym kontrolerem viewcontroller lub dodać jakiś kolor lub obiekty w widoku uiviewcontroller – Esqarrouth

1

kod:

AddTaskViewController *add = [[AddTaskViewController alloc] init]; 
[self presentViewController:add animated:YES completion:nil]; 

Ten kod może idzie do innego kontrolera, ale masz nowy viewController, nie kontroler swojego scenorysu, możesz zrobić tak:

AddTaskViewController *add = [self.storyboard instantiateViewControllerWithIdentifier:@"YourStoryboardID"]; 
[self presentViewController:add animated:YES completion:nil]; 
0

Spróbuj wykonać następujące czynności:

NextViewController *nextView = [self.storyboard instantiateViewControllerWithIdentifier:@"nextView"]; 
[self presentViewController:nextView animated:YES completion:NULL]; 
-1
LandingScreenViewController *nextView=[self.storyboard instantiateViewControllerWithIdentifier:@"nextView"]; 
[self presentViewController:nextView animated:YES completion:^{}]; 
+0

To [recenzenci] (http://stackoverflow.com/review/low-quality-posts/11794904): jeśli odpowiedź jest zła, ale jest odpowiedzią (jak to jest), nie polecam usuwania: downvote! Zobacz [Robisz to źle: prośba o zdrowie psychiczne w kolejce postów o niskiej jakości] (http://meta.stackoverflow.com/q/287563/1364007). To jest odpowiedź. Nie możesz się z tym zgodzić, ale jest to próba odpowiedzi na pytanie. –

+0

Do MNIDR: czy mógłbyś * wyjaśnić * swój kod, proszę? –

0

Spróbuj kod:

[self.navigationController presentViewController:controller animated:YES completion:nil]; 
0

Najlepszym sposobem jest

AddTaskViewController * add = [self.storyboard instantiateViewControllerWithIdentifier:@"addID"]; 
[self presentViewController:add animated:YES completion:nil]; 
1

Musisz ustawić storyboard Id z ujęć tożsamości inspektora

AddTaskViewController *add=[self.storyboard instantiateViewControllerWithIdentifier:@"storyboard_id"]; 
[self presentViewController:add animated:YES completion:nil];