2012-03-16 23 views
5

Sto tentando di utilizzare NSUserdefaults per salvare alcuni dati da un campo di testo, voglio che venga salvato quando l'applicazione si chiude e viene caricata all'avvio dell'applicazione, tuttavia ho eseguito un muro.Come utilizzare NSUserDefaults con AppDelegate

I metodi che voglio utilizzare sono tutti in AppDelegate, ora non capisco come usare AppDelegate molto bene, ho pensato a due possibili modi per ottenere ciò, non ho idea se funzionerebbe comunque.

  1. Importa AppDelegate e nel corso cavalcare i metodi dentro la mia VC O
  2. creare un'istanza della mia VC in AppDelegate e consentire AppDelegate per impostare e recuperare il testo del mio UITextField - (Non questo andare contro il MVC paradigma?)

Ogni suggerimento apprezzato

La ringrazio molto per il vostro tempo

risposta

2

Come lei ha ricordato in precedenza avete due opzioni:

1-) Direttamente raggiungere VC UITextField da applicationDidFinishLaunching e applicationWillTerminate metodi AppDelegate s'.

Su applicationDidFinishLaunching:

Leggi dal NSUserDefaults, impostare UITextField in VC.

Su applicationWillTerminate:

Leggi dal UITextField in VC, impostare NSUserDefaults e synchronize.

2) Creare i metodi corretti in VC per fare lo stesso lavoro e chiamarli da AppDelegate.

-(void)record 
{ 
// Read from UITextField, set UserDefaults and synchonize. 
} 

-(void)restore 
{ 
// Read from UserDefaults, set UITextField. 
} 
+0

Grazie per l'input, il secondo metodo suona molto più facile per me lol. ma non sta importando il mio VC in AppDelegate considerato male? o è permesso? Dal momento che non ho collegato il mio VC all'AppDelegate, non riesco a trovare come o faccio a creare un'istanza. – user1214037

+0

Se è l'unico VC, è già accessibile da rootViewController per impostazione predefinita. Puoi chiamarli in AppDelegate in questo modo: [record self.rootViewController]; – erkanyildiz

+0

È uno dei tanti :). Sto usando uno storyboard, inoltre ho cancellato quello originale per usare un controller di navigazione. – user1214037

1

vorrei suggerire solo la registrazione per alcune notifiche UIApplication nella sottoclasse e rispondere in modo adeguato. Ecco il link ai documenti di UIApplication. Le notifiche alle quali puoi iscriverti sono elencate in fondo alla pagina.

http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html

Ecco un esempio di quello che si potrebbe fare nella sottoclasse:

[[NSNotificationCenter defaultCenter] addObserver:self 
             Selector:@selector(restore) 
              name:UIApplicationDidFinishLaunchingNotification 
              object :nil]; 

Non dimenticare di rimuovere se stessi come un osservatore. Ci sono molti tutorial online se non ti senti a tuo agio con NSNotifications.

0

È certamente consentito al delegato dell'app di mantenere un riferimento alla catena del controller di visualizzazione. Gli esempi e i modelli di app iOS di Apple spesso mettono un puntatore a un controller di visualizzazione radice in una variabile di istanza Delega app.

Se la catena del controller di visualizzazione non è interrotta, è possibile che il delegato dell'app invii un messaggio "cleanUpNow" al controller di visualizzazione superiore o root e che i controller di visualizzazione passino in quella catena, con ogni controller di visualizzazione ripulire se necessario e quindi rinviare il messaggio a tutti gli altri controller più in basso nella catena per ripulire.

Raggiungere direttamente in un'altra vista il controller è probabilmente meno pulito che invia un messaggio per ripulire se stesso (scrivere su NSDefaults ecc.). Forse hanno il messaggio di tutti loro un oggetto centrale "clean up" il cui scopo è quello di raccogliere tutto lo stato necessario e scriverlo in un unico blocco coerente.

Se la catena è interrotta, un'altra opzione consente al delegato dell'app di inviare una notifica, con tutti i controller necessari per ripulire i gestori di registrazione per la notifica di "pulizia".

3

Invece di mantenere il campo di testo in AppDelegate, mantenere il testo. Farei quanto segue:

1) In AppDelegate.h:

@property (strong, nonatomic) NSString *textToBeSaved; 

2) In AppDelegate.m, leggere e scrivere textToBeSaved per NSUserDefaults quando i lanci di app e termina. Sul lancio:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
self.textToBeSaved = [defaults objectForKey:@"save_me"]; 

e, prima della cessazione:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults setValue:self.textToBeSaved forKey:@"save_me"]; 
BOOL success = [defaults synchronize]; 

3) In SomeViewController.m che possiede naturalmente l'UITextField, in viewWillAppear:

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
myTextField.text = appDelegate.textToBeSaved; 

4) Quando si imposta la textToBeSaved dipende dall'interfaccia utente, ma ogni volta che sai che il testo è pronto (ad esempio su textFieldShouldReturn o shouldEndEditing), puoi consegnare la stringa a AppDelegate:

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
appDelegate.textToBeSaved = myTextField.text; 

Se c'è alcuna interfaccia utente per consentire all'utente di accettare il testo, è possibile salvare la stringa su (textField: shouldChangeCharactersInRange: ReplacementString).

Problemi correlati