T#032 – Sfruttiamo NSUserDefaults per salvare dati delle nostre applicazioni iPhone
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

















complimenti 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?