2012-01-28 10 views
57

Sto cercando modi alternativi per spingere i controller di visualizzazione istanziati nello storyboard a livello di codice. realtà ho trovato due modi, che uso per andare alla visualizzazione successiva, ma anche per tornare al precedente:Modi alternativi per spingere i controller di visualizzazione con storyboard a livello di programmazione

  1. utilizzando pushViewController:

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil]; 
    LocationWebView *lvc = [storyboard instantiateViewControllerWithIdentifier:@"LocationWebView"]; 
    [self.navigationController pushViewController:lvc animated:YES]; 
    
  2. eseguendo Segue di programmazione:

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

avete som e suggerimenti sulle alternative e sul modo migliore di eseguire questa operazione? Si noti che non mi riferisco alle visualizzazioni modali.

+0

personalmente, dal momento che stai usando uno Storyboard e prosegue, quindi # 2 è un modo più bello di farlo. –

+0

può # 1 essere utile se si deve premere un viewcontroller che non può avere un seguito? per esempio spingere il controllore di vista dal pulsante di apertura delle annotazioni di mapview. – kappa

+0

Tutto può avere un seguito. Non tutto può avere un * automatico * seguito interamente realizzato in IB (come pulsanti e celle di tabella). Ma è comunque possibile creare un seguito in IB a partire da un controller di visualizzazione stesso e utilizzare # 2 per eseguirlo; questo è esattamente ciò che faresti per i pulsanti di callout della mappa. – rickster

risposta

4

Personalmente, utilizzo il n. 2 quando mi trovo in un UIViewController che si trova sotto un UINavigationController. Non penso che funzionerà non ci sono UINavigationController.

Quando sto usando una vista che è sotto un UITabBarController, io uso il seguente codice per la transizione ad un'altra scheda:

NSUInteger tabIndex = 2; // Index of the tab I want to select 
UIViewController * viewCtrl = [_tabController.viewControllers objectAtIndex:tabIndex]; 
_tabController.selectedViewController = viewCtrl; 
+2

Non dovrebbe 'objectAtIndex: 0' essere' objectAtIndex: tabIndex'? – Kevin

+0

@Kevin Hai ragione. Ho fatto la modifica nell'esempio. – gfrigon

36

Apple raccomanda di utilizzare performSegueWithIdentifier:sender:someObject per eseguire programmazione segues. Ci sono almeno un paio di vantaggi a farlo in questo modo:

  • Meno del proprio codice significa che stai lasciando il quadro non più del lavoro. Se Apple presenta un nuovo effetto visivo super cool per i follower, o migliora le prestazioni, o corregge un bug in qualche futura versione di iOS, la tua app può ottenerlo gratuitamente. E ogni linea di codice che scrivi per far funzionare il framework potrebbe farti aumentare le tue possibilità di scrivere bug.

  • Altro in IB può significare più facile da cambiare. Se decidi di voler cambiare tutti i tuoi follower in passate modali o alcuni tipi di sequenze personalizzate in cui esegui il tuo fantastico effetto visivo, puoi selezionarli tutti in IB e cambiare il tipo di seguito con un solo clic invece di cercare in giro nel tuo codice.


Inoltre, se si utilizza il primo o il secondo metodo, spingendo un controller della vista, al fine di andare "indietro" ad un precedente controller di vista non funziona il modo in cui gli utenti si aspettano. Quando si preme un SongViewController, è aggiunto alla fine dello stack di navigazione:

LocationViewController -> SongViewController 

Se poi spingere LocationViewController di nuovo di andare "indietro":

LocationViewController -> SongViewController -> LocationViewController 

Se l'utente tocca il pulsante Indietro la barra di navigazione, torneranno dalla vista posizione alla vista brano alla vista posizione. (Inoltre, se continui a farlo, ogni "indietro" e "avanti" si aggiungerà a una sempre crescente catena di controller di visualizzazione, il che potrebbe portare ad altri problemi.)

Invece, dovresti lasciare che il controller di navigazione gestisca tornare indietro.Mette un pulsante nella barra di navigazione a tale scopo, che dovrebbe gestire la maggior parte dei casi d'uso. Se è necessario eseguire il controllo personale per tornare indietro, non è possibile farlo in IB con iOS 5, ma è possibile farlo a livello di programmazione con il metodo popViewControllerAnimated: del controller di navigazione.