Se state sviluppando un’applicazione iPhone, molto probabilmente potreste aver bisogno di salvare dei dati durante l’uso dell’applicazione, da ritrovare poi ai successivi avvii del programma. Potreste sfruttare quello che vi proponiamo oggi per salvare, ad esempio, dei dati di configurazione per le vostre Applicazioni. Se questo è quello che cercate, sappiate che in nostro aiuto arriva NSUserDefaults, la quale ci permette proprio di salvare alcuni contenuti. Questi, una volta salvati, appariranno anche se chiudiamo e riapriamo la nostra app.
Come esempio costruiremo un’applicazione semplice, in cui dovremmo inserire del testo in una UITextField. Questo testo verrà salvato e faremo in modo di farlo riapparire poi al riavvio della nostra App. Diciamo che faremo un “Hello World!” avanzato!
Prima di tutto, apriamo Xcode, creiamo un nuovo progetto di tipo “View-based Application” e chiamiamolo “SalvaStringa” (o come preferite). Apriamo il file SalvaStringaViewController.h e dichiariamo gli outlets che useremo con le relative proprietà ed un’azione:
@interface SalvaStringaViewController : UIViewController {
IBOutlet UITextField *campo;
IBOutlet UILabel *testo;
}
- (IBAction)leggi;
@property (nonatomic, retain) IBOutlet UITextField *campo;
@property (nonatomic, retain) IBOutlet UILabel *testo;
@end
Come vedete tutto molto semplice, si tratta di una semplice Text Field, una Label di Testo e un’azione che useremo poi per leggere il contenuto del testo.
Apriamo il file SalvaStringaViewController.xib e passiamo a InterfaceBuilder. Costruiamo quindi la semplice interfaccia grafica, infine, colleghiamo dal pannello delle connessioni del nostro File’s Owner, i due outlets e il metodo creati precedentemente con Xcode con i nostri oggetti appena disegnati.

Modifichiamo ora il file “SalvaStringaViewController.m” come segue:
@synthesize campo, testo;
- (IBAction)leggi{
NSString *stringaTesto = campo.text;
testo.text = [[NSString alloc] initWithFormat:@"%@", stringaTesto];
NSString *testoInserito = testo.text;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:testoInserito forKey:@"ciao"];
[defaults synchronize];
}
Analizziamo il codice. Innanzitutto grazie a @synthesize saremo in grado di utilizzare tutte le proprietà dei nostri oggetti dichiarati in precedenza; nelle prime due linee abbiamo semplicemente letto il testo che l’utente inserisce nella Text Field e lo abbiamo fatto apparire nella nostra label. Nelle altre quattro, avviene il salvataggio del testo: tramite NSUserDefaults settiamo un oggetto (setObject:) e una chiave collegata con esso (forKey:).
Sempre nel file di implementazione (.m), scommentiamo il metodo viewDidLoad, che si trova un po’ più in basso e, dopo [super viewDidLoad];, scriviamo le seguenti istruzioni:
NSString *testoSalvato = [[NSUserDefaults standardUserDefaults] objectForKey:@"ciao"];
if (testoSalvato == nil) {
testo.text = @"Non hai ancora inserito il tuo nome";
} else {
testo.text = [[NSString alloc] initWithFormat:@"Ciao %@", testoSalvato];
}
Questo codice verrà eseguito al caricamento della vista. Come potete vedere, abbiamo settato una NSString che riprende le informazioni necessarie da un oggetto di tipo NSUserDefaults con chiave “ciao” (quello di prima). Successivamente tramite un semplicissimo “if – else” diciamo cosa deve fare l’app in caso in cui non ci siano dati salvati e in caso che questi, invece, siano presenti.
Come ultimissima cosa, sempre nel file .m, inseriamo questo metodo per far nascondere la tastiera alla pressione del pulsante “Invio”:
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
[textField resignFirstResponder];
return YES;
}
Riaprite ora il file .xib e dopo aver cliccato sulla Text Field, andate nel pannello dele connessioni e collegate l’unico elemento (delegate) sotto gli Outlets al File’s Owner. (ATTENZIONE a questo passaggio, fonte di errore molto comune).
Abbiamo conluso la nostra applicazione! Cliccate su Build and Run, inserite un testo nella Text Field, premete il bottone ed ecco il risultato:

Se chiudete ora e riaprite l’applicazione questo sarà il risultato:

Alla prossima 🙂
16 Responses to “T#032 – Sfruttiamo NSUserDefaults per salvare dati delle nostre applicazioni iPhone”
13 Aprile 2010
dylandoggcomplimenti per il tutorial!! la mia domanda è: questo metodo può essere utilizzato per salvare dati tipo quelli di una app come brushes? se no cosa consigliate?
30 Maggio 2010
Luigiio lho usato per salvare un dizionario di preferiti senza problemi
24 Luglio 2010
dylandoggciao a tutti, ho una multiview app. si tratta di un fumetto. se io volessi salvare una viewcontroller (tramite uibutton) che corrisponde ad una determinata pagina del fumetto (come il segnalibro di ibooks) e poi poterci tornare da un’altra viewcontroller sempre tramite uibutton… NSUserDefault fa a caso mio?
24 Luglio 2010
bebus77Potresti fare in questo modo, numeri le pagine e alla pressione del bottone controlla il numero lo salva con nsuserdefault e all’avvio dell’app controlla il numero e vai alla view con quel numero
26 Luglio 2010
dylandoggOk grazie!! ci provo!!
20 Agosto 2010
DavideCiao, vorrei sapere se questo metodo sfrutta la ram dell’iphone o la memoria “fisica”…va bene che quando riavvio l’app ritrovo tutto, però se riavvio il telefono continua a funzionare?
Grazie,
15 Aprile 2011
stefanopossibile che non riesco a farlo funzionare questo programma ? chi mi manda via email il file per favore ?
bmw0202@gmail.com
26 Aprile 2011
Fabbroz75Ciao e complimenti per tutti Vostri sforzi nel creare questo meraviglioso sito dove poter imparare al meglio come sviluppare sotto iOS.
Colgo l’occasione per chiderVi come poter salvare un file immagine scaricato online per farlo apparire come background. teoricamente dovrei entrare in una cartella tipo: /home/user/background e copiare dentro il file, ma le mie attuali conoscenze in obj-c sono minime, pur essendo uno sviluppatore da anni (asm,php, etc etc).
Grazie per la Cortese Attenzione
Fabrizio
11 Giugno 2011
MaveDevFunziona perfettamente, molto utile grazie mille.
Anche io sono curioso di sapere se questi dati sono salvati nella ram o nella memoria fisica del device, ma visto che non si fa’ accenno ne’ a core data ne’ al database sql, credo proprio siano salvati nella ram e i dati non siano salvati per sempre nel “melefonino”.
Grazie ancora, ciao a presto 🙂
26 Giugno 2011
Gingi74Ciao, ma se voglio salvare la posizione di un UISwitch, e ritrovarla nella stessa posizione dopo il riavvio del iPhone, come posso fare????????
1 Luglio 2011
marcoRicavi il valore di stato e lo salvi associandolo a una chiave, ad esempio “statoSwitch”. Quando ricarichi l’app all’avvio cerchi tale valore e setti di conseguenza lo switch
25 Agosto 2011
Gingi74Non ci riesco e questa cosa mi sta facendo impazzire, se non è troppo disturbo potresti fare un piccolo tutorial.
Grazie comunque.
14 Dicembre 2011
doMacragazzi posso utilizzarlo per salvare più di un’informazione ?
29 Gennaio 2012
RobertoCiao ragazzi, sono nuovo nell’ambiente di programmazione xcode e devo ringraziare tutti per l’aiuto grande che fornisce questo sito.
In questo caso non riesco a memorizzare più di un dato e penso di averle provate tutte. Ho cercato anche su altri forum sia italiani che non, ma niente.
Aiuto!
12 Giugno 2012
AntonelloPDCiao a tutti,
ottimo modo per salvare, e per cancellare questo dato associato a questa chiave ?
funziona il :
[ ... removeObjectForKey:@"" ]
??
cosa devo mettere alla sinistra di questa chiamata ?
Grazie mille e buon lavoro a tutti
23 Novembre 2012
LucaComplimenti per l’articolo. volevo chiederVi se è consigliato utilizzare NSUserDefaults anche per storicizzare la risposta di una chiamata asincrona, tipo json. Oppure c’è altra struttura dati consigliata?
Grazie in anticipo