Introduzione
L'utilizzo di UINavigationController ed i relativi metodi di inserimento nello stack (pushViewController) potrebbero non risultare comodi per lo switch di viste all'interno di un'applicazione.

L'applicazione della lezione precedente, ad esempio, sebbene utilizzi due viste (una per ogni funzionalita') non trae giovamento dalla navigazione gerarchica offerta da UINavigationController. L'usabilita', inoltre, ne risulta seriamente compromessa.

Per applicazioni in cui lo switch tra view e' inteso piu' come un cambio di contesto (switchcontext) che come una navigazione gerarchica, e' possibile usare il concetto di multiplexing accennato nella lezione precedente.

Per switchare agevolmente la view presentata a schermo, e' sufficiente aggiornare la property view. A titolo di esempio, proveremo ad utilizzare un nuovo oggetto: UISegmentedControl, come switcher tra le varie viste (funzionalita') della nostra applicazione.



Layout della nostra applicazione
Visto che i controllori di vista dell'esempio precedente erano usati esclusivamente per l'inizializzazione e visualizzazione a schermo delle view (loadView), proveremo a raggruppare i due viewControllers in un'unica classe UIViewController in grado di scegliere e selezionare in maniera opportuna la view (funzionalita') da mostrare a schermo.




Creiamo una nuova classe di tipo UIViewController ed indichiamo nella dichiarazione di interfaccia gli oggetti e le classi che interverranno nell'implementazione:




Oltre alle dichiarazioni per gli oggetti CalculatorView ed CurrencyConverterView, intervengono due nuove dichiarazioni di oggetti: UISegmentedControl ed UIToolBar.



UISegmentedControl
Un tipico controllo che si trova spesso nelle applicazioni iPhone e' UISegmentedControl.




L'idea e' quella di combinare una serie di pulsanti in un oggetto unico, che ne implementi la selezione esclusiva di uno di essi. UISegmentedContol e' utile in tutte le situazioni in cui bisogna scegliere tra una serie di dati simili concettualmente tra loro. Una tipica istanza della classe UISegmentedControl, potrebbe essere qualcosa del tipo:




Una volta istanziato il controllo, esso puo' essere mostrato a schermo assegnandolo alla property navigationItem.titleView del nostro viewController. Questa operazione sostituisce il testo, mostrato come titolo della navigation bar, con una view complessa (UISegmentedControl, eredita anch'esso da UIView).

Ovviamente, e' possibile assegnare alla property titleView qualunque oggetto che eredita da UIView. In questo modo e' possibile sostituire il normale comportamento della barra di titolo della UINavigationBar secondo i nostri scopi.

self.navigationItem.titleView = segmentedControl;



Per aggiornare la nostra property self.view, quando l'utente sceglie un'opzione dal SegmentedControl, usiamo il metodo addTarget:.



Quando l'utente seleziona un'opzione (UIControlEventValueChanged) viene invocato il selettore segmetedControlPressed:. Questo metodo si preoccupera' di switchare la view corrente con una di quelle che abbiamo precedentemente istanziato nel metodo loadView.




La property selectedSegmentIndex viene riempita alla pressione del tasto con un indice intero, corrispondente al tasto selezionato. In questo modo sara' possibile distinguere tra i tasti presenti.

Nota come il metodo riceve un parametro (id)sender. Nella nostra implementazione, facciamo uso della variabile di istanza segmentedControl, ma sarebbe stato possibile effettuare un cast a UISegmentedControl dell'oggetto ricevuto come parametro, selezionando la sua property in maniera analoga.

-(void)segmentedControlPressed:(id)sender {
   UISegmentedControl *castedSegmentedControl = sender;
   ...
   ...
}





UIToolbar e UIBarButtonItem
Un altro componente dell'UIKit molto popolare nelle NavigationBar e' l'oggetto UIToolbar. Le toolbars possono ospitare un insieme variabile di pulsanti. Tra di essi sono presenti anche pulsanti di sistema predefiniti (bookmark, search, etc.). Molte applicazioni fornite con iPhone, fanno uso di questo oggetto per estendere le funzionalita' della UINavigationBar (Mail, Safari, etc.).

Prima di poter mostrare una toolbar, e' necessario creare i pulsanti che si intendono mostrare all'utente. Ogni pulsante sara' aggiunto ad un array, creato attraverso la classe standard Cocoa NSMutableArray.

NSMutableArray *buttons = [[NSMutableArray alloc] init];


I tipi di pulsanti piu' comuni sono quelli rappresentati da immagini o testo. Entrambi i tipo sono creati attraverso la classe UIBarButtonItem. A seconda se vogliamo immagini o testo per le etichette dei nostri pulsanti, useremo dei metodi di inizializzazione diversi.

initWithImage sara' il metodo da usare nel caso vogliamo assegnare un'immagine al nostro pulsante. initWithTitle, invece, sara' il metodo da usare per delle etichette di testo standard.






Creazione della UIToolbar
Una volta creato l'array con i pulsanti che si intendono mostrare a schermo, dobbiamo allocare un oggetto contenitore UIToolbar. A tale scopo utilizziamo il metodo di inizializzazione initWithFrame:, fornendo il posizionamento e la dimensione desiderata per la nostra UIToolbar.



Una volta ottenuta la nuova istanza dell'oggetto, configuriamo lo stile desiderato e la sorgente dei pulsanti da visualizzare (l'array generato precedentemente).

Non dimentichiamo di aggiungere la nuova view cosi' creata alla view principale dello schermo.



L'oggetto UIPasteboard
Restano da implementare i metodi di copia ed incolla che abbiamo aggiunto nella UITabBar. Per fare questo, useremo un oggetto standard dell'UIKit: UIPasteboard.

La classe UIPasteboard ci permette di condividere dati all'interno della stessa applicazione o fra applicazioni diverse, utilizzando una pasteboard generale o specifica. Tipicamente, un oggetto della nostra applicazione scrive dei dati all'interno dell'oggetto pasteboard quando viene richiesta l'azione di copia. Un altro oggetto, quindi, utilizza i dati che si trovano all'interno della pasteboard per effettuare un'operazione di incolla quando viene richiesta l'operazione.

Una pasteboard e' una regione di memoria condivisa dove e' possibile accedere in lettura/scrittura. Esisono due pasteboard di sistema: UIPasteboardNameGeneral ed UIPasteboardNameFind. La prima viene utilizzata per le operazioni di copia-incolla che coinvolgono dati generici; la seconda, invece, viene utilizzata in operazioni di ricerca mantenendo la stringa piu' recente nella search bar.

Inoltre, le applicazioni possono creare la propria pasteboard per i propri usi specifici (scambio di dati all'interno dell'applicazione). Ogni pasteboard deve avere un identificativo univoco. E' possibile marcare come persistente una pasteboard, in maniera che permanga anche dopo la chiusura e riapertura dell'applicazione. Le pasteboard di sistema sono persistenti di default.

UIPasteboard fornisce tutti i metodi necessari per leggere e scrivere singoli elementi o elementi multipli. I dati scritti o letti possono presentarsi in due forme generali. Se i dati da scrivere sono una property-list (o l'oggetto puo' essere convertito in property-list), useremo il metodo setValue:forPasteboardType: per inserirlo all'interno della pasteboard.

Se i dati da scrivere sono binari (ad esempio, un'immagine) o non possono essere convertiti in tipo property-list, useremo il metodo setData:forPasteboardType:.

Ricordiamo che le classi convertibili in plist sono: NSString, NSArray, NSDictionary, NSDate, NSNumber and NSURL.




Restano da implementare due metodi relativi alle classi CalculatorView ed CurrencyConverterView. Questi metodi saranno i responsabili (setter/getter) per il valore mostrato nel display dell'oggetto. A seconda se stiamo visualizzando il convertitore di valuta o la calcolatrice, dovremo distinguere l'oggetto display usato. In ogni caso, i metodi faranno accesso alla property text del relativo oggetto myDisplay.




Nota: Avremmo potuto implementare i due metodi (setter e getter), attraverso l'uso dei costrutti @property / @synthetize. Come si sarebbe dovuto procedere in questo caso?



Riferimenti
- iPhone OS Reference Library :UIPasteboard 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