Introduzione
Nella lezione precedente, abbiamo visto come risulta facile mostare una serie di elementi all'interno di una table view. Come primo argomento della lezione di oggi, vedremo come raggruppare una serie di elementi tra loro. Successivamente, sposteremo la nostra attenzione sulla ricerca ed indicizzazione all'interno di una table view. Infine, vedremo come customizzare i risultati modificando l'aspetto delle singole celle.






Adattamento della sorgente di dati
Se guardiamo la figura sopra, risulta ovvio come i nostri dati debbano essere raggruppati in due sezioni distinte: nazioni visitate e nazioni da visitare. Abbiamo bisogno, quindi, di modificare la nostra sorgente di dati in maniera da rispecchiare queste informazioni in maniera veloce ed immediata. Come sorgente di dati continueremo ad utilizzare un NSMutableArray. Stavolta, lo popoleremo con due oggetti di tipo NSDictionary.

Gli oggetti NSDictionary conterranno una coppia chiave/valore, dove la chiave sara' una stringa ed il valore sara' un array contenente tutte le nazioni.




Creiamo due array: uno contenente le nazioni da visitare e l'altro contenente quelle gia' visitate. Gli array sono usati per creare due oggetti NSDicitionary con la chiave "Countries". Entrambi gli oggetti NSDictionary sono aggiunti all'array della lezione precedente, listOfItems.



Preparare la UITableView per mostare i dati
La nostra table view ha bisogno di conoscere quante sezioni dovranno essere mostate a schermo. Quest'informazione viene ritornata dal metodo numberOfSectionsInTableView.




Sara' necessario conoscere anche il numero di elementi per ogni sezione.




L'array listOfItems contiene due elementi dizionario. Il metodo sopra, quindi, verra' chiamato due volte. Useremo l'indice dell'array per distinguere le varie chiamate al metodo (e quindi la sezione attualmente interessata).
Trovato il dizionario corretto, recuperiamo l'array utilizzando la chiave Countries. Infine, ritorniamo il numero di elementi all'interno dell'array.



Configurazione del testo di intestazione sezione
Abbiamo configurato il numero di sezioni e le righe per ognuna di esse. Dobbiamo ancora configurare il testo da mostrare all'inizio di ogni sezione. Quest'operazione viene effettuata dal metodo tableView:titleForHeaderInSection.

Visto che il primo dizionario nell'array listOfItems contiene la lista delle nazioni da visitare ed il secondo quelle gia' visitate, utilizziamo quest'informazione per selezionare il valore di section piu' adatto.






Mostrare i nuovi contenuti
Adesso dobbiamo mostrare i contenuti relativamente alle due sezioni della nostra table view. La logica e' simile a quella utilizzata nella lezione precedente. Dobbiamo prima trovare quale dizionario utilizzare, attraverso la property section dell'oggetto NSIndexPath. Una volta ottenuta la giusta sezione, utilizziamo l'array contenuto al suo interno attraverso la chiave Countries.






Selezionare la riga corretta
Il metodo tableView:didSelectRowAtIndexPath deve essere modificato in maniera da tenere in considerazione la nuova struttura dati ed aggiornare la table view.






Navigazione tramite indici
Un'altro modo per la navigazione efficiente della sorgente di dati e' quello di dotare la nostra table view di un indice. La prima cosa da fare e' creare un'oggetto per contenere i valori dell'indice da mostrare; utilizzeremo un NSArray a questo scopo. La documentazione Apple, suggerisce di impostare lo stile della UITableView in UITableViewStylePlain, sebbene non venga generato nessun errore con stili diversi. Il metodo che si occupa di creare e restituire l'indice delle sezioni e' sectionIndexTitlesForTableView:




Il metodo crea e ritorna un oggetto array contenente gli elementi da mostrare nella barra degli indici a destra.



Gestione dell'evento di selezione indice
Alla selezione di un elemento nella barra degli indici, viene lanciato un messaggio di tableView:sectionForSectionIndexTitle:atIndex, il quale ritorna l'indice della sezione da mostrare. Dal momento che abbiamo solo due sezioni nella nostra sorgente di dati, adatteremo questo metodo per tornare sempre le nostre due sezioni.






Ricerca all'interno di una tableview
Per dotare la nostra table view di un pannello di ricerca, dobbiamo modificare leggermente il codice sorgente gia' scritto ed aggiungere alcuni metodi necessari per la corretta gestione dell'oggetto UISearchBar.

La prima cosa da fare e' aggiungere la dichiarazione dei nuovi oggetti e variabili da usare all'interno della classe MyTableViewController. In particolare, dovremo dotare la nostra classe controllore di un nuovo oggetto denominato UISearchBar e di alcune variabili d'appoggio necessarie al suo funzionamento.




Dobbiamo modificare il metodo di viewDidLoad, in maniera da inizializzare correttamente le nuove variabili ed i nuovi oggetti appena dichiarati. In particolare, dovremo creare un frame per contenere la UISearchBar e dovremo, successivamente, associare al campo tableHeaderView il nuovo oggetto creato. Ogni table view ha due properties di tipo UIView personalizzabili dall'utente, in maniera da ospitare delle viste con contenuti speciali in testa (HeaderView) o in basso (FooterView) alla tableView.




La prima cosa da fare e' creare un frame atto a contenere il nuovo oggetto. Inizializzeremo, quindi, un array temporaneo per conservare i risultati della ricerca attuale e due variabili booleane indicanti, rispettivamente, una ricerca in corso (searching) e la possibilita' di selezionare o meno una riga (letUserSelectRow). Dovremo, inoltre, assegnare un delegato per l'oggetto UISearchBar. Questo significa adottare un nuovo protocollo nella nostra classe controllore ed implementare alcuni metodi per dialogare correttamente con il nuovo oggetto appena creato.






Gestione degli eventi per la ricerca
Il protocollo UISearchBarDelegate, offre alcuni metodi per la gestione degli eventi legati alla ricerca. Prima di illustrarli e spiegarli, proviamo ad esaminare un contesto d'azione tipico legato alla ricerca. Le azioni da intraperendere quando l'utente inizia la ricerca, cliccando all'interno dell'oggetto UISearchBar, possono essere riassunte come segue:

   - Impostare la variabile booleana searching a YES.
   - Impostare la variabile booleana letUserSelectRow a NO.
   - Disabilitare lo scrolling della table view.
   - Mostrare un tasto per concludere la ricerca (Done).
   - Iniziare/continuare la ricerca ad ogni inserimento/cancellazione di caratteri.
   - Copiare i risultati in una sorgente di dati separata.
   - Mostrare i risultati come unica lista.
   - Nascondere la tastiera e concludere la ricerca.


Il primo evento di cui dovremo occuparci e' quello lanciato con il messaggio searchBarTextDidBeginEditing. Questo messaggio viene inviato quando l'utente inizia per la prima volta la ricerca (quando clicca all'interno della casella di testo presente nella UISearchBar).




Abbiamo disabilitato la possibilita' di effettuare selezioni di righe ed inibito la possibilita' di effettuare uno scrolling della table view. Il metodo di selezione va' modificato per rispecchiare il nuovo comportamento:




Se siamo abilitati a selezionare una riga, ritorniamo l'indice corretto. Altrimenti, ritorniamo un valore di nil.

Alla pressione del tasto Done, viene invocato il metodo doneSearchingClicked. Questo metodo dovra' reimpostare tutte le variabili ad uno stato pre-ricerca.






Modifica del campo di ricerca
Adesso, dobbiamo preoccuparci di effettuare la ricerca all'interno della nostra sorgente di dati, basandoci sul contenuto del campo di testo dell'oggetto UISearchBar. Precedentemente, avevamo impostato come delegato per l'oggetto in questione la nostra classe MyFirstTableViewController. Questo ci permette di implementare un metodo che "reagisce" ai cambiamenti del contenuto del campo di testo sopracitato.




Nel caso in cui il campo di testo ha una lunghezza maggiore di zero, possiamo procedere con la ricerca, invocando il metodo searchTableView. Questo metodo, copiera' i risultati ottenuti all'interno della sorgente di dati temporanea copyListOfItems, rendendoli fruibili a tutti gli altri metodi.






Mostrare i risultati della ricerca
Restano da modificare i metodi che dialogavano con la sorgente di dati listOfItems. Essi dovranno verificare se siamo in presenza di una ricerca attiva (variabile booleana searching). In questo caso utilizzeremo i valori della sorgente di dati temporanea copyListOfItems.
















Riferimenti
- iPhone OS Reference Library :UITableView Class Reference
- iPhone OS Reference Library :UINavigationController Class Reference
- Mac OS X Reference Library: iPhone Application Programming Guide
- Mac OS X Reference Library: Window and Views
- iPhone SDK Application Development - Capitolo 3



    lap1

downloads