Wo ist der Fehler? TableView speichern mit NSUserDefaults

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Wo ist der Fehler? TableView speichern mit NSUserDefaults

    Hallo,

    ich habe in meinem Programm ein TableView den ich gerne mit NSUserDefaults speichern möchte.
    Habe mich auch schon dran probiert aber es will nicht so recht.
    Wo habe ich den Fehler gemacht?

    Quellcode

    1. ​- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
    2. {
    3. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    4. [_arrayController addObjects:[NSUnarchiver unarchiveObjectWithData:[defaults objectForKey:@"arrayController"]]];
    5. }
    6. - (void)applicationWillTerminate:(NSNotification *)notification
    7. {
    8. NSData *data = [NSArchiver archivedDataWithRootObject:_arrayController];
    9. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    10. [defaults setObject:data forKey:@"arrayController"];
    11. [defaults synchronize];
    12. }
    Alles anzeigen


    Freue mich schon auf eure Hilfen :)
  • @macmoonshine Das ist auch so gewollt, es handelt sich um eine Mac App und sie soll die Werte bei beenden des Programms speichern.


    @MCDan Ich habe einen NSArrayController der mittels bindings mit meinem TableView verknüpft ist (was soweit auch alles funktioniert), diesen TableView bzw. den ArrayController würde ich gerne speichern.


    @beage In dem ArrayController sind Objekte der Klasse "Kunde", und da NSUserDefaults keine Objekte speichern kann dachte ich probiere ich es mal mit NSData.
  • Wenn _arrayController vom Typ NSArrayController ist, dann kann der o.a. Code auch nicht funktionieren, denn:

    1) in applicationWillTerminate: erstellst Du Archiv Daten mit einem RootObject vom Typ NSArrayController.

    2) in applicationDidFinishLaunching: verwendest Du bei addObjects: einen NSArrayController und kein NSArray, was eigentlich verlangt wird.

    Wenn in applicationWillTerminate: tatsächlich Daten in den UserDefaults abgelegt werden, dann müsste die App in applicationDidFinishLaunching: in der Zeile

    Quellcode

    1. [_arrayController addObjects:[NSUnarchiver unarchiveObjectWithData:[defaults objectForKey:@"arrayController"]]];

    crashen, da ein Objekt vom falschen Typ an addObjects: übergeben wird.

    Hast Du in applicationDidFinishLaunching: mal geprüft, ob in den UserDefaults überhaupt Daten zum Key "arrayController" vorhanden sind und welches Objekt nach unarchiveObjectWithData: dabei heraus kommt?

    Hast Du in der Klasse "Kunde" das NSCoding Protokoll implementiert?

    Du solltest beim Speichern der Daten nicht den kompletten ArrrayController serialisieren sondern nur die arrangedObjects des ArrrayControllers. ;)
  • Ja in der Klasse Kunde ist NSCoding implementiert.

    Wenn ich das richtig verstanden habe müsste es eigentlich so richtig sein aber es funktioniert nicht.

    Quellcode

    1. - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
    2. {
    3. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    4. NSArray *array = [[NSArray alloc]initWithArray:[NSUnarchiver unarchiveObjectWithData:[defaults objectForKey:@"array"]]];
    5. [_arraycontroller addObject:array];
    6. }
    7. - (void)applicationWillTerminate:(NSNotification *)notification
    8. {
    9. NSMutableArray *array = [[NSMutableArray alloc]init];
    10. array = [_arraycontroller arrangedObjects];
    11. NSData *data = [NSArchiver archivedDataWithRootObject:array];
    12. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    13. [defaults setObject:data forKey:@"array"];
    14. [defaults synchronize];
    15. }
    Alles anzeigen
  • Hi,

    Deine Zeilen 7 sowie 16 und 18 solltest Du Dir nochmal anschauen. Vor allem hinsichtlich dem Unterschied zwischen Objekten und Objektreferenzen und die Tatsache, wie man neue Objekte erzeugt. Unter MRC hast Du in Zeile 16 ein Speicherleck. In Zeile 7 erzeugst Du ein überflüssiges Array

    Außerdem muss es in Zeile 9 nicht "addObject:" sondern "addObjects:" heißen. Du möchtest ja nicht das Array sondern dessen Inhalt hinzufügen. Ansonsten kann ich mich dem Rat von MCDan nur anschließen: Debuggen ist nicht verboten und ist oft ein richtiger Augenöffner :D

    schönen Gruß

    gandhi
  • Ja stimmt.
    Jetzt funktioniert es, hatte auch noch Fehler im Protokoll.

    Quellcode

    1. ​- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
    2. {
    3. @try
    4. {
    5. NSData *notesData = [[NSUserDefaults standardUserDefaults] objectForKey:@"array"];
    6. [_arraycontroller addObjects:[NSKeyedUnarchiver unarchiveObjectWithData:notesData]];
    7. }
    8. @catch (NSException *exception)
    9. {
    10. NSLog(@"******%@*******",exception.name);
    11. NSLog(@"******%@*******",exception.reason);
    12. }
    13. }
    14. - (void)applicationWillTerminate:(NSNotification *)notification
    15. {
    16. @try
    17. {
    18. _array = [_arraycontroller arrangedObjects];
    19. NSData *data = [NSKeyedArchiver archivedDataWithRootObject:_array];
    20. [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"array"];
    21. }
    22. @catch (NSException *exception)
    23. {
    24. NSLog(@"******%@*******",exception.name);
    25. NSLog(@"******%@*******",exception.reason);
    26. }
    27. }
    Alles anzeigen


    Vielen Dank für euer Hilfe.