2 Stimmen

NSUserDefaults lädt kein String-Array

Bevor jemand sagt, dass dies eine Frage ist, die schon oft gestellt wurde, habe ich etwa 20 verschiedene Antworten durchgelesen und alles ausprobiert, was ich gefunden habe. Trotzdem habe ich erst vor etwa 5 Tagen mit Objective-C angefangen, also gibt es wahrscheinlich eine sehr einfache Lösung.

Es scheint, dass NSUserDefaults kein Array aus der Standard-Property-Liste lädt, obwohl es auf viele verschiedene Arten aufgerufen wird. Bevor ich weitermache, hier ist mein Code zum Lesen des Arrays:

      fishArrayMutable = [[NSMutableArray alloc] initWithArray:(NSArray*)[defaults objectForKey:@"fishArray"] copyItems:TRUE];

     if (fishArrayMutable == nil)
     {
       fishArrayMutable =  [[NSMutableArray alloc] init];
       UIAlertView *alert = [[UIAlertView alloc] init];
       [alert setTitle:@"fishArray = nil"];
       [alert addButtonWithTitle:@"Ok"];
       [alert show];
       [alert release];
     }

Und hier ist mein Code für das Schreiben des Arrays:

[defaults setObject:fishArrayMutable forKey:@"fishArray"];

[defaults synchronize];

Das wird langsam zu einem sehr frustrierenden Problem, und ich habe versucht, das Problem zu isolieren, und bin zu dem Schluss gekommen, dass es beim Lesen liegt. Das Mutable Array ist in der Header-Datei deklariert. Bitte helfen Sie mir, das beschäftigt mich jetzt seit etwa 6 Stunden...

3voto

zaph Punkte 110105

Ich vermute, dass der Fehler einer der folgenden ist:

  1. defaults ist nicht initialisiert.
  2. Die userDefaults sind nicht vor dem Lesen festgelegt.
  3. Die userDefaults werden vor dem Lesen überschrieben.

Teilen Sie jeden Schritt auf und schreiben Sie Tests vor und nach jedem Schritt.

1) NSLog fishArrayMutable dort, wo es geschrieben ist, um den Array-Inhalt zu überprüfen.
2) Sofort nach dem Schreiben von fishArrayMutable zu den defaults NSLog der User Defaults. Beispiel:

NSLog(@"Vor dem Schreiben von fishArray: %@", fishArrayMutable);
[defaults setObject:fishArrayMutable forKey:@"fishArray"];
NSLog(@"Nach dem Schreiben von fishArray: %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"fishArray"]);

Beachten Sie, dass die NSLog-Anweisungen kein defaults verwenden, um sie selbstständig zu halten.

Führen Sie ähnliche NSLog-Anweisungen um das Lesen (und machen Sie das Lesen zu zwei Anweisungen):

NSLog(@"Vor dem Lesen von fishArray: %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"fishArray"]);
NSArray *fishArray = [defaults objectForKey:@"fishArray"];
NSLog(@"Nach dem Lesen von fishArray: %@", fishArray);
fishArrayMutable = [[NSMutableArray alloc] initWithArray:fishArray copyItems:TRUE];
NSLog(@"Nach dem Erstellen von fishArrayMutable: %@", fishArrayMutable);

Dann sollte das Problem ziemlich offensichtlich sein.

Hinweis: Da die Array-Elemente selbst aufgrund von NSUserDefaults unveränderlich sein werden, anstelle von:
fishArrayMutable = [[NSMutableArray alloc] initWithArray:fishArray copyItems:TRUE];
sollten Sie einfach mutableCopy verwenden können:
fishArrayMutable = [fishArray mutableCopy];

1voto

Frade Punkte 2830

Versuchen Sie, mutableArrayValueForKey zu verwenden. Überprüfen Sie diesen Link

Verwenden Sie es so:

fishArrayMutable = [[NSMutableArray alloc] initWithArray:[defaults mutableArrayValueForKey:@"fishArray"]];

es funktioniert für mich

BEARBEITEN:

Schreiben:

[defaults setObject:fishArrayMutable forKey="fishArray"];
[defaults synchronize];

Laden:

NSMutableArray *array = [defaults mutableArrayValueForKey="fishArray"];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X