Ciao a tutti, sono Gabriele e in questa serie di articoli vi spiegherò come aggiungere e gestire le impostazioni nelle vostre Applicazioni iPhone e iPad tramite l’app nativa “Impostazioni”, presente in ogni dispositivo mobile Apple. Quando sviluppiamo un’applicazione per l’iPhone o iPad e vogliamo dare la possibilità di far scegliere alcune impostazioni ai nostri utenti, possiamo in realtà seguire due strade, ognuna con i suoi pregi e difetti, vediamo insieme quali sono, poi ci concentreremo sulla seconda opzione.
Come gestire le preferenze nelle applicazioni iPhone e iPad?
Come anticipato poco fa esistono due tecniche differenti:
- Prima soluzione: realizziamo un’apposita view all’interno dell’applicazione stessa, molto utile quando non vogliamo far uscire l’utente dalla nostra app (molto comodo, ad esempio, quando si crea un gioco). In questo caso ci dovremo preoccupare di sviluppare l’intera view interna alla nostra app e il relativo controller per ogni device supportato. L’applicazione, in questo modo, risulterà un tantino più pesante in termini di pacchetto da scaricare e di RAM occupata durante l’uso e, ovviamente, dovremmo farla interagire perfettamente con il resto dell’applicazione.
- Seconda soluzione: ci appoggiamo all’app nativa “Impostazioni”, opzione che potrebbe risultare scomoda quando occorre modificare le impostazioni di continuo (ad esempio la calibrazione dell’accelerometro in un videogioco). Al contrario, risulta un’ottima scelta le per memorizzare dati come gli account o impostazioni poco variabili nel tempo. Le dimensioni della nostra app, e di conseguenza il download della stessa, non si appesantisce più di tanto (vedremo che per utilizzare alcune impostazioni di base occorrerà aggiungere un solo file) e non ce ne dovremo inoltre preoccupare all’interno del flusso dell’app principale, se non per recuperare i valori impostati. Infine, ultima considerazione ma non meno importante, non ci sarà ovviamente bisogno di adattare la view alla grafica dell’iPad o dell’iPhone 4 anche quando vogliamo creare un’app universale.
Creiamo un nuovo progetto XCode
Fatta questa piccola premessa partiamo con il nostro tutorial. Apriamo XCode e creiamo un nuovo progetto per iPhone di tipo “view-based” (scegliamolo dall’elenco dei template disponibili), diamo quindi un nome e procediamo (il mio l’ho chiamato per comodità “preferences_part1”).
Aggiungiamo quindi il file delle impostazioni cliccando su “Add -> New File” e nel gruppo iOs andiamo a cercare “Resource” quindi “Settings Bundle”.

Come nome per il file ho lasciato quello di default, “Settings.bundle”.

Il bundle appena creato contiene due files: “Root.plist” e “Root.strings”, tralasciamo quest’ultimo e concentriamoci su “Root.plist”. Apriamolo e noteremo che questo è già popolato:

Come si può notare, sono presenti una serie di “Item” che contengono diversi tipi di chiavi, vediamo brevemente quali sono i tipi di controlli che possiamo utilizzare:
| Tipo | Identificativo |
| Testo | PSTextFieldSpecifier |
| Titolo | PSTitleValueSpecifier |
| Switch On/Off | PSToggleSwitchSpecifier |
| Slider | PSSliderSpecifier |
| Scelta Multipla | PSMultiValueSpecifier |
| Gruppo | PSGroupSpecifier |
| Pannello secondario | PSChildPaneSpecifier |
Vediamo ora come si utilizzano eliminando nel nostro “Root.plist” i quattro Item (e solo quelli), ottenendo una situazione simile alla seguente:

Popoliamo le impostazioni
Aggiungiamo un Item in “PreferenceSpecifiers” selezionando questa riga e cliccando sul pulsante oltre la destra della tabella, modifichiamo il tipo dell’ “Item 0” appena aggiunto in “Dictionary” (sostituendolo al “String” di default).
Selezioniamo “Item 0” e clicchiamo sul pulsante alla destra della tabella per inserire la prima chiave. Scriviamo quindi in “Key” (la colonna di sinistra) la parola “Type” e in “Value” (la colonna di destra) “PSGroupSpecifier”.
Selezionando ora la riga appena modificata e clicchiamo sul “+” a fine tabella, nella nuova riga scriviamo in “Key” “Title” e in “Value” “Gruppo 1”.
Abbiamo appena aggiunto un gruppo nel pannello delle Impostazioni!
Eseguiamo il “Build and Run” e nel simulatore usciamo dall’applicazione (ancora vuota) ed entriamo nelle Impostazioni (nel mio caso “Settings”), come vedete c’è una nuova riga “preferences_part1” nella tabella. Aprendola troveremo proprio “Gruppo 1”:).

Torniamo in Xcode e continuiamo a popolare il file “Root.plist” fino ad ottenere una situazione simile alla seguente:


Rapida spiegazione del contenuto:
- nei campi “Type” di ogni Item si imposta un tipo tra quelli elencati nella tabella
- il campo “Title” contiene la stringa da far visualizzare nella sinistra del campo di tipo “Type” appena inserito
- il campo “Key” contiene una chiave che utilizzeremo nel programma per ottenere il valore impostato utilizzando il paradigma KVC.
Questi sono i campi principali, ora un piccolo compito per voi a casa: provate a cambiare in un campo “PSTextFieldSpecifier” il booleano “IsSecure”, o ad inserire tra le “KeyboardType” uno tra questi valori “NumbersAndPunctuation”, “NumberPad”, “URL”, “EmailAddress” e notate come vi cambia il campo di testo nelle impostazioni 😉 .
Interfaccia utente delle impostazioni e un po’ di codice
Passiamo quindi a realizzare l’interfaccia grafica dell’applicazione utilizzando Interface Builder e XCode.
Inidiamo a dichiarare gli oggetti che useremo. Il codice da inserire nel file header del ViewController è il seguente:
@interface preferences_part1ViewController : UIViewController {
IBOutlet UILabel* nome;
IBOutlet UILabel* si_no;
IBOutlet UILabel* voto;
IBOutlet UILabel* interessato;
IBOutlet UIButton* refresh;
}
aggiungiamo inoltre un IBAction che associeremo al pulsante e ci permetterà di prelevare i dati delle impostazioni:
-(IBAction) refresh;
Apriamo ora Interface Builder e trasciniamo semplicemente gli oggetti all’interno della view. Dopo una sistemata generale dovrebbe presentarsi più o meno in questo modo:

Colleghiamo quindi gli outlet del controller agli oggetti della view appena disegnati:

Aggiungiamo infine il codice necessario per leggere i valori all’interno del metodo “refresh”:
-(IBAction) refresh
{
NSUserDefaults* userDef = [NSUserDefaults standardUserDefaults];
[nome setText:[userDef stringForKey:@"yourName"]];
[si_no setText:[userDef stringForKey:@"yesOrNo"]];
[voto setText:[userDef stringForKey:@"theSlider"]];
[interessato setText:[userDef stringForKey:@"votoMultivalue"]];
}
Come avrete notato, alla pressione del pulsante otteniamo, tramite un metodo di classe, un riferimento alla classe NSUserDefaults, che di fatto è la classe “ponte” tra la nostra app e quella delle Impostazioni.
Il passo successivo è valorizzare le label della nostra view utilizzando i valori ottenuti dalle chiavi indicate, ovvero quelle inserite nel file “Root.plist” alla voce “Key” dei vari Item!
Compiliamo ed eseguiamo, l’applicazione nel simulatore ci mostra le label non valorizzate, per leggerle correttamente usciamo dall’applicazione, andiamo a modificare le impostazioni e torniamo nell’applicazione, clicchiamo quinsi sul tasto “refresh” ed ecco i valori inseriti.


Per questa prima parte è tutto, prossimamente vedremo come ampliare e migliorare le impostazioni della nostra applicazione 🙂
Se avete problemi con il tutorial, questo è il nostro file di progetto.









13 Responses to “T#092 – Gestire le Preferenze delle nostre Applicazioni iPhone e iPad (Parte 1)”
12 Aprile 2011
DarioBella lììììì
Questo tutorial ci voleva proprio!
In gamba ragazzi!!!
13 Aprile 2011
Gabriele PongelliSono contento che anche questo argomento interessi un pochino 😉
Non è finita comunque qui perché sono in programma altri tutorial sull’argomento 😉
13 Aprile 2011
nitroxx92Non vedo l’ora! Giusto perchè devo portare una email da questo bundle alla mia app ma non riesco a farle fare cosa voglio io =(
26 Giugno 2011
Gabriele Pongelliciao nitroxx, scusa se ti rispondo solo adesso ma non mi è arrivata la notifica del tuo commento…
per leggere all’interno del tuo software un campo delle preferenze (nel tuo caso una email) basta seguire questo tutorial, in particolare per il campo “nome”.
per qualsiasi problema sono qui 😉
26 Giugno 2011
Gingi74Ciao, complimenti per il tutorial.
Ma se devo solamente usare un UISwitch per settare l’applicazione, devo per forza usare un settings bundler?
Nella mia App non riesco a memorizzare la posizione dello Switch e quindi al successivo riavvio devo nuovamente cambiare la preferenza.
Cosa devo fare?
27 Giugno 2011
Gabriele PongelliSe vuoi inserire questa impostazione nell’applicazione “impostazioni” la risposta è sempre “si, ti serve un settings.bundle” .
Essendo un solo switch io sarei tentato di inserirlo in una view del progetto, magari in quella tipica di “Info” , “Credits” o simili.
Per quanto riguarda la posizione dello switch non mi è molto chiara la domanda: stai parlando di un progetto utilizzando un settings.bundle ? Hai seguito come ho fatto io nel tutorial e non funziona lo switch?
27 Giugno 2011
Gingi74Ciao, ho inserito lo switch in una view del progetto.
La modifica all’applicazione data dall’uso dello switch funziona, solo che non riesco a far memorizzare la posizione dello switch.
27 Giugno 2011
Gabriele Pongellidevi rendere persistente la modifica della posizione dello switch, salvando il valore in un .plist, in un database o in un file di testo, da ricaricare ogni volta che apri l’applicazione 😉
27 Giugno 2011
Gingi74Se non è troppo disturbo, potresti farmi un esempio con codice?
28 Giugno 2011
Gabriele PongelliBasta fare una semplice ricerca qui su devapp e trovi almeno un paio di tutorial sulla lettura e salvataggio dei file 😉
3 Luglio 2011
Localizzare le preferenze delle applicazioni iPhone e iPad | devAPP[…] lingue, seguendo il tutorial di Vanni, sappiamo aggiungere le nostre preferenze, seguendo il mio precedente tutorial, ma forse non avete ancora idea di come si localizzino le preferenze delle nostre app iOS? Se non […]
30 Marzo 2012
Daniele BussandriCiao, ho scaricato il codice di questo tutorial, ma cliccando il button refresh le label non si popolano, anzi, si svuotano..
sapresti dirmi come mai?dove sbaglio?
1 Aprile 2012
Gabriele PongelliCiao,
come dice la guida, prima di fare refresh sei andato nelle impostazioni e hai modificato qualche campo?
una volta cambiati i valori nelle impostazioni vai nell’applicazione e fai il refresh.
Ing. Gabriele Pongelli .