2013-07-11 4 views
6

In meiner Anwendung möchte ich das Datum speichern, an dem die App zum ersten Mal gestartet wird.
Ich verwende in Anwendung folgenden Code: didFinishLaunchingWithOptions Methode
iOS - NSDate kann nicht in NSUserDefaults gespeichert werden

NSDate* today = [NSDate date]; 
[[NSUserDefaults standardUserDefaults] registerDefaults: @{@"CONSCIENCE_START_DATE" : today}]; 

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"CONSCIENCE_START_DATE"]); 

Aber jedes Mal, wenn ich die Anwendung zu starten, dessen Drucken der Zeitpunkt, an dem die App gestartet wird. Es druckt nicht das Datum, an dem ich die App gestartet habe.

Ich habe versucht, den Simulator zurückzusetzen und den Code erneut ausgeführt. Immer noch kein Erfolg. Kann mir jemand den Fehler in meinem Code bitte anzeigen?

+1

Vergessen Sie nicht zu [Standardwerte synchronisieren]; ? –

+1

Wenn Sie das Datum bei jedem Start der App festlegen, warum erwarten Sie dann etwas anderes als das aktuelle Datum? – rmaddy

+0

@rpaddy, Sorry, ich habe meinen Code aktualisiert – Satyam

Antwort

14

Da Ihr Ziel ist es, den Überblick über das erste Mal ein Benutzer Ihre Anwendung beginnt, müssen Sie so etwas wie dies in application:didFinishLaunchingWithOptions:

NSDate *date = [[NSUserDefaults standardUserDefaults] objectForKey:@"CONSCIENCE_START_DATE"]; 
if (!date) { 
    // This is the 1st run of the app 
    date = [NSDate date]; 
    [[NSUserDefaults standardUserDefaults] setObject:date forKey:@"CONSCIENCE_START_DATE"]; // Save date 
} 

NSLog(@"First run was %@", date); 
+0

seit registerDefaults wird nur beim nächsten Start der App zum ersten Mal aufgerufen, da die Standardwerte bereits gesetzt sind, wird es nicht wieder die Standardwerte setzen. Es wird erwartet, dass NSUserDefaults die Daten dauerhaft speichert. Ist es nicht? – Satyam

+3

Nein, 'registerDefaults' wird jedes Mal aufgerufen, wenn Sie es aufrufen. 'registerDefaults' schreibt nichts. Es liefert nur einen Wert, wenn ein Aufruf zum Abrufen eines Wertes andernfalls 'nil' zurückgeben würde. In diesem Fall macht die Verwendung von 'registerDefaults' keinen Sinn. – rmaddy

+1

vielen Dank für die Klärung. – Satyam

5

Sie müssen [[NSUserDefaults standardDefaults] synchronize] aufrufen, nachdem Sie den Wert festgelegt haben.

Vom Apple Docs:

Zur Laufzeit verwenden Sie ein NSUserDefaults Objekt die Standardeinstellung zu lesen, die Ihre Anwendung verwendet von einem Default-Datenbank des Benutzers. NSUserDefaults zwischenspeichert die Informationen, um zu vermeiden, die Standardeinstellungen des Benutzers jedes Mal zu öffnen, wenn Sie einen Standardwert benötigen. Die Synchronisierungs-Methode, die automatisch in periodischen Intervallen aufgerufen wird, hält die in Cache-Speicher synchron mit

einem Default-Datenbank des Benutzers.

+0

Ihr Update beweist meinen Standpunkt. Das Betriebssystem synchronisiert automatisch die Benutzereinstellungen für Sie. – rmaddy

+0

Hat nicht ganz verstanden, was er gefragt hat –

-1

Sie können

var auf diese Weise speichern und abrufen Startdatum: NSDate? {

get { 
     return NSUserDefaults.standardUserDefaults().objectForKey(BCGConstants.UserDefaultsKey.startDateKey) as? NSDate 
    } 

    set { 
     NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: BCGConstants.UserDefaultsKey.startDateKey) 
     NSUserDefaults.standardUserDefaults().synchronize() 
    } 
} 
Verwandte Themen