25

Sto utilizzando il metodo presentViewController:animated:completion: per passare a un altro controller di visualizzazione.iOS: controller vista attuale programmaticallly

Questo è il mio codice:

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

Questo codice va all'altro UIViewController ma l'altro controllore è vuota. Ho sempre usato gli storyboard ma ora ho bisogno che questo venga fatto in codice.

+1

Questa non è una domanda Xcode. Inoltre, non ho potuto dedurre cosa intendi per "l'altro controller è nulla", quindi l'ho lasciato intatto. –

risposta

38

Se si utilizza uno storyboard, probabilmente non si dovrebbe usare alloc e init per creare un nuovo controller di visualizzazione. Invece, guarda il tuo storyboard e trova il segue che vuoi eseguire; dovrebbe avere un identificatore univoco (e in caso contrario, è possibile impostarne uno nella barra laterale destra).

Una volta trovato l'identificatore che segue, invia il tuo corrente del controller vista un messaggio -performSegueWithIdentifier:sender:

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

Questo farà sì che la storyboard creare un'istanza di un AddTaskViewController e presentarlo nel modo in cui si ho definito per quel seguito.


Se, d'altra parte, non si sta usando uno storyboard a tutti, allora avete bisogno di dare il vostro AddTaskViewController qualche tipo di interfaccia utente. Il modo più comune di farlo è quello di inizializzare il controller con un pennino: invece di chiamare init, potrai chiamare -initWithNibName:bundle: e fornire il nome di un file .xib che contiene l'interfaccia utente aggiuntivo compito:

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

(Ci sono altri modi (meno comuni) di ottenere una vista associata al nuovo controller di visualizzazione, ma probabilmente questo ti presenterà il minimo problema per riuscire a lavorare.)

+0

Se combinato con un pulsante funziona. ma non è combinato. – Salieh

+0

Quindi, come "non si presenta" il nuovo controller di visualizzazione nello scenario di non storyboard? Sto cercando su google cercando qualcosa di simile a unwindForSegue: versoViewController: – matrixugly

+1

In realtà, ho appena trovato "dismissViewController" che penso sia la risposta giusta. – matrixugly

28

Se stai usando Storyboard e il tuo "aggiungi" viewController è nello storyboard, quindi imposta un identificatore per il tuo "aggiungi" per il controllo delle impostazioni in modo da poter fare qualcosa del genere:

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

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

se non avete il vostro "add" viewController in storyboard o un file di pennino e desidera creare il tutto programmaticaly poi appDocs dice:

Se non è possibile definire le vostre opinioni in uno storyboard o un file di pennini, sovrascrivere il metodo loadView per istanziare manualmente una gerarchia di viste e assegnarla alla proprietà view.

-1

Ecco come si può fare a Swift:

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

Questo carica semplicemente un UIViewController vuoto –

+4

ovviamente lo fa. Devi sostituirlo con il tuo viewcontroller, o aggiungere una sorta di colore o oggetti all'interno della vista di uiviewcontroller – Esqarrouth

1

il tuo codice:

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

Questo codice può va verso l'altro controllore, ma si ottiene una nuova viewController, non il controller del tuo storyboard, puoi fare così:

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

provare quanto segue:

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

Per [revisori] (http://stackoverflow.com/review/low-quality-posts/11794904): se il la risposta è negativa ma è una risposta (come questa), non è consigliabile eliminarla: downvote! Vedi [Stai sbagliando: una richiesta di sanità mentale nella coda Messaggi di bassa qualità] (http://meta.stackoverflow.com/q/287563/1364007). Questa è una risposta. Potresti non essere d'accordo, ma è un tentativo di rispondere alla domanda. –

+0

Per MNIDR: potresti * spiegare * il tuo codice per favore? –

0

provare questo codice:

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

Il modo migliore è

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

È necessario impostare storyboard Id da storyboard identità ispettore

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