In questo articolo tratteremo la classe UINavigationController tanto utile e cara a quasi tutti gli sviluppatori iPhone. La suddetta classe, per intenderci, è quella che consente di passare da una vista (UIViewController meglio) ad un’altra con la simpatica animazione dello scorrimento da destra a sinistra facendo apparire solitamente un tasto in alto a sinistra per tornare alla vista precedente. Ecco un esempio tratto dalla documentazione Apple:


Esempio di un UINavigationController


Ma analizziamo ora in dettaglio come funziona questa classe.

UINavigationController non è altro che uno stack di UIViewController. Chi conosce un po’ di teoria del C capisce subito il suo funzionamento e può immaginare le sue possibili funzioni, ma per chi non lo sapesse ecco una breve spiegazione.

Immaginiamo lo stack come una pila di libri, ogni nuovo libro (in questo caso UIViewController) viene posto sopra a tutti gli atri e non è possibile rimuovere un qualsiasi altro libro, altrimenti la pila cadrebbe. L’unica soluzione è togliere un libro alla volta partendo dall’ultimo inserito, dal libro in cima.

Da questo ragionamento se ne deduce quindi la “filosofia” dello stack in generale:

Il primo ad entrare è l’ultimo ad uscire“.

Di conseguenza si possono dedurre anche le azioni che potranno essere applicate allo stack:

 

  • push (per aggiungere un elemento allo stack);
  • pop (per togliere l’ultimo elemento inserito).

Il tutto sembra molto semplice, ed infatti lo è!

Portiamoci al caso specifico della classe trattata, dalla documentazione Apple si capisce subito la semplicità della classe e dei suoi metodi:

  • - (id)initWithRootViewController:(UIViewController *)rootViewController per inizializzare l’oggetto con il primo elemento dello stack;
  • - (void)pushViewController:(UIViewController *)viewController animated:(BOOL) animated per aggiungere un elemento allo stack;
  • - (UIViewController *)popViewControllerAnimated:(BOOL)animated per togliere l’ultimo elemento inserito;

Lascio a voi analizzare gli altri metodi che sono delle estensioni dei due metodi principali e consentono principalmente di andare direttamente al primo elemento (eliminando sempre tutti gli atri elementi) o di andare ad un elemento predefinito o di ottenere un array con tutti gli elementi dello stack etc.

Piccoli dettagli per facilitarne l’uso

UINavigationController si utilizza con gli oggetti della classe UIViewController, ma come fare ad aggiungere questi ultimi al UINavigationController non avendo il riferimento (puntatore) a quest’ultimo oggetto?

Semplice:

ogni UIViewController ha una proprietà (navigationController) che è il puntatore al UINavigationController di cui esso fa parte. Mi spiego meglio con un esempio:

// inizializzo un UIViewController, sarà il primo dello stack
UIViewController *firstViewController = [[UIViewController alloc] init];
 
// inizializzo il mio UINavigationController con il primo elemento dello stack
UINavigationController *myNavigationController = [[UINavigationController alloc] initWithRootViewController:firstViewController];
 
[firstViewController release];
 
// rendo visibile la vista del myNavigationController
[window addSubview:myNavigationController.view];
 
[myNavigationController release];

Ora lo stack si presenta così



// firstViewController implementation
// ...
 
UIViewController *secondViewController = [[UIViewController alloc] init];
 
// aggiungo un altro elemento allo stack
[self.navigationController pushViewController:secondViewController animated:YES];
 
[secondViewController release];

Ora lo stack si presenta con un elemento in più:



Infine per tornare al UIViewController precedente basta fare:

// secondViewController implementation
// ...
 
[self.navigationController popViewControllerAnimated:YES];