Gestire la navigazione
Creare un’app multi Controller La quasi totalità delle app è suddivisa in più ViewControllers, ognuno con specifiche funzionalità L’utente deve poter navigare fra i vari controller secondo pattern ricorrenti e platform-specific: NavigationController : un ViewController finalizzato alla gestione della navigazione fra le varie schermate. ViewController modali : interruzione del flusso di controllo corrente per mostrare un differente controller. Generalmente usato per ottenere informazioni dall’utente.
NavigationController NavigationBar Tasto back Titolo della schermata precedente Titolo della schermata attuale Top ViewController Navigation controller NavigationItem
NavigationController La schermata precedente mostra alcune proprietà del Navigation Controller NavigationBar : mostrata nella parte superiore dello schermo, contiene il NavigationItem NavigationItem : presenta all’utente informazioni e pulsanti per eseguire specifiche azioni. Tasto back : se premuto riporta l’utente alla schermata precedente. Gestito direttamente dal sistema. TopViewController : è il controller principale, cioè quello correntemente mostrato all’utente.
NavigationController Il navigation controller gestisce tutti gli aspetti relativi alla navigazione, cioè: Stack dei ViewController : mantiene l’elenco di tutti i controllers mostrati precedentemente, per sapere a quale tornare in caso di pressione del tasto back. Layout della Navigation Bar (colore della barra, colore di titolo e bottoni). Animazioni e gesture
Usare il NavigationController La figura mostra come inserire il NavigationController nel nostro progetto: Selezionare il Root View Controller, cioè quello a partire dal quale useremo il Navigation. Selezionare Editor > Embed in > Navigation Controller Vedremo apparire magicamente un nuovo Controller nello Storyboard.
Configurare il NavigationController Selezionando il nuovo controller, abbiamo la possibilità di configurare alcuni aspetti: Indicare se la navigation bar e la toolbar (un’ulteriore barra che sarà mostrata in fondo alla schermata) devono essere mostrate. Indicare se, e con quali trigger, nascondere le barre.
Configurare la NavigationBar Selezionando la NavigationBar, possiamo configurare il suo aspetto grafico: Selezionare lo stile base Impostare il colore della barra Personalizzare il tasto back Personalizzare il testo relativo al titolo
self.NavigationController Proprietà posseduta da ogni istanza di UIViewController E’ nil se il controller non si trova all’interno di un navigation Espone i principali metodi per gestire la navigazione: pushViewController : naviga ad un nuovo controller popViewControllerAnimated : torna al controller precedente popToRootViewControllerAnimated : torna al primo controller presente nello stack setNavigationBarTutti i metodi richiedono il valore animated, che indica se deve essere utilizzata o meno un’animazione Hidden : indica se mostrare o nascondere la barra di navigazione
Creare un nuovo controller A lato è riportata la sequenza di operazioni per creare un nuovo controller: Selezionare File > New > File... Selezionare Cocoa Class Inserire il nome del nuovo controller ed impostarlo come sottoclasse di UIViewController.
Creare un nuovo controller Una volta creato il file relativo tale controller, è necessario crearlo anche nello storyboard Trascinare nello storyboard un nuovo oggetto di tipo ViewController Indicare come classe, il file appena creato ed assegnare uno StoryboardID univoco
Mostrare il nuovo controller Per poter mostrare il nuovo controller, è necessario innanzitutto istanziarlo: Accedere allo Storyboard tramite la proprietà, del ViewController corrente, self.storyboard. Invocare il metodo storyboard?.instantiateViewControllerWithIdentifier, passando come parametro lo StoryboardID definito. Dato che il valore di ritorno è di tipo AnyObject, è necessario forzare il downcast tramite l’operatore as. A questo punto è sufficiente utilizzare i metodi del navigation controller per gestire la transizione.
Usare i Segues Oltre al meccanismo appena visto, iOS ci offre un’ulteriore possibilità per gestire la transizione fra due controllers: i segues. I segues possono essere considerati come dei trigger automatici, associati alla pressione di un determinato bottone, che aprono automaticamente un nuovo controller.
Usare i Segues Per inizializzare un nuovo segue dobbiamo associare al trigger il nuovo ViewController da mostrare. E’ inoltre necessario scegliere il tipo di segue. I più utilizzati sono show (utilizza il navigation controller) e present modally (mostra il nuovo controller in maniera modale).
Intercettare i segue Può capitare di aver la necessità di intercettare l’invocazione di un segue, principalmente per passare un parametro al nuovo controller. Sovrascrivere il metodo prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?). Si tratta di un metodo della classe UIViewController. Recuperare il controller di destinazione tramite la seguente istruzione: var controllerToShow : SecondViewController = segue.destinationViewController as! SecondViewController; Passare gli eventuali parametri al nuovo controller: controllerToShow.testo = "Segue!";
Button items Oltre al tasto back, è possibile aggiungere dei bottoni personalizzati alla barra. Inizializzare un nuovo UIBarButtonItem, passando come parametri al costruttore Titolo o immagine da visualizzare Stile del bottone Selector: specificano quale metodo di quale oggetto dovrà gestire la pressione del tasto. Il primo è un oggetto, mentre il secondo richiede semplicemente il nome del metodo. Aggiungere il bottone al navigation item: self.navigationItem.setRightBarButtonItem(button, animated: false);
Controller modali Come accennato, in alcuni casi può risultare utile aprire dei ViewControllers modali. Generalmente usati per richiedere operazioni da parte dell’utente, che restituiscono un risultato (Ad esempio se l’utente deve selezionare la propria data di nascita). Istanziare il nuovo controller normalmente. Sul controller chiamante è necessario invocare il metodo presentViewController(controllerToShow, animated: true, completion: (()->void)?) Dopo aver completato l’esecuzione, è necessario invocare, sul controller modale, il metodo dismissViewControllerAnimated(Bool);