Array und Plist werden beim verlassen des Views geleert.

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

  • Array und Plist werden beim verlassen des Views geleert.

    --> Ich weiß, das ist ein langer Text, aber ich hoffe es macht sich trotzdem jemand die Mühe, es durchzulesen und evtl. zu antworten :) <--

    Und zwar habe ich einen tableViewController, der zu einer detailView führt. In der detailView wird ein MutableArray mit verschiedenen Strings gefüllt, je nachdem welche Cell angeklickt wurde. Das klappt auch super. Wenn ich nun aber in meiner NavigationBar auf Zurück klicke und eine andere Cell auswähle, wird der MutableArray geleert und mit dem anderen String gefüllt. Das passiert nicht, wenn ich per TabBar die View wechsle und zurück gehe!
    Ich suche schon seit ein paar Tagen nach einer Lösung, habe schon verschiedenste Methoden ausprobiert, den MutableArray zu deklarieren (auch static). Das hat alles leider nicht geklappt.
    Dann habe ich jetzt versucht, die Strings in eine property list zu packen, weil ich sie sowieso speichern wollte, aber da taucht genau dasselbe Problem auf.

    Momentan fülle ich testweise den Array und die Plist. Der Array ist bei mir als static implementiert:

    Quellcode

    1. static NSMutableArray *favoritenArrayDetail;


    Die Plist habe ich folgendermaßen deklariert:

    Quellcode

    1. NSString *errorDescription = nil;
    2. NSPropertyListFormat *format = NULL;
    3. NSString *plistPath;
    4. NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES)objectAtIndex:0];
    5. plistPath = [rootPath stringByAppendingPathComponent:@"Data.plist"];
    6. if(![[NSFileManager defaultManager]fileExistsAtPath:plistPath])
    7. {
    8. plistPath = [[NSBundle mainBundle]pathForResource:@"Data" ofType:@"plist"];
    9. }
    10. NSData *plistData = [[NSFileManager defaultManager]contentsAtPath:plistPath];
    11. NSDictionary *temporaryDictionary = (NSDictionary *) [NSPropertyListSerialization propertyListFromData:plistData mutabilityOption:NSPropertyListMutableContainersAndLeaves format:format errorDescription:&errorDescription];
    12. if (!temporaryDictionary)
    13. {
    14. NSLog(@"Datei konnte nicht gelesen werden.");
    15. }
    16. dict1 = [temporaryDictionary objectForKey:@"Item 1"];
    Alles anzeigen


    So weit, so gut!
    Wenn ich dann in meiner detailView auf einen Button klicke, wird folgende Funktion aufgerufen: (ein Ausschnitt)

    Quellcode

    1. if([name_Test isEqualToString:@""])
    2. {
    3. NSLog(@"Leer");
    4. }
    5. else
    6. {
    7. if([name_Test isEqualToString:@"X"])
    8. {
    9. if([favoritenArrayDetail containsObject:@"X"])
    10. {
    11. [favoritenArrayDetail removeObject:@"X"];
    12. NSLog(@"%@ existieren schon im Array, wird entfernt.", name_Test);
    13. NSLog(@"Favoriten Array: %@", favoritenArrayDetail);
    14. [dict1 removeObjectForKey:@"X"];
    15. NSLog(@"Objekt existiert bereits in plist, wird entfernt. \nPlist: %@", dict1);
    16. }
    17. else
    18. {
    19. [favoritenArrayDetail addObject:name_Test];
    20. NSLog(@"Favoriten Array: %@", favoritenArrayDetail);
    21. [dict1 setObject:@"X" forKey:@"X"];
    22. NSLog(@"Plist: %@", dict1);
    23. }
    24. }
    Alles anzeigen


    Zuerst checke ich, ob der Name der Cell, die ich angeklickt habe, überhaupt etwas beinhaltet.
    Dann schaue ich, welche Cell angeklickt wurde. (Das ganze wiederholt sich ein paar mal leicht verändert).
    Danach schaue ich, ob der String schon im Array/Plist vorhanden ist, wenn ja entferne ich ihn, wenn nein füge ich ihn hinzu.

    Das klappt auch alles super, nur wenn ich jetzt die View über den Zurück Button verlasse, wird der Array und Plist geleert und ich kann mir einfach nicht erklären, warum?? ?(

    MfG Johannes
  • Nur mal so ins Blaue geraten, wird der View released? Ist dein Array ne Property von dem View? Wenn ja, dann ganz schlecht, weil Du die Nutzdaten mit dem View verwurstelst, halte das Array extern
  • Ich bin mir nicht sicher, ob du das meinst, aber ich hab ARC an, also eigentlich ja.
    Naja ich hatte den Array mal als property, jetzt allerdings als static Variable, was aber wohl keinen großen Unterschied bei meinem Problem machen dürfte.
    Wie kann ich denn den Array extern machen?

    @Alves: Wie meinst du das? Ich bin mit Datenspeicherung noch nicht so bewandert, ich habe mir erst 2 Tutorials zu Plists angeschaut.
  • johannesm schrieb:

    Ich bin mir nicht sicher, ob du das meinst, aber ich hab ARC an, also eigentlich ja.
    Naja ich hatte den Array mal als property, jetzt allerdings als static Variable, was aber wohl keinen großen Unterschied bei meinem Problem machen dürfte.
    Wie kann ich denn den Array extern machen?

    In dem du deine Nutzdaten über nen Controller mit dem View verbindest. Wann immer auf die Nutzdaten zugreifen willst, frag den Controller danach und sonst niemanden!
    Die Nutzdaten sind dein Model

    developer.apple.com/library/io…oc/uid/TP40002974-CH6-SW1
  • johannesm schrieb:

    Okay, kann ich das auch mit der Property List machen, denn das wäre wesentlich einfacher, wenn man die hätte und dort von allen View Controllern aus zugreifen kann.

    Das ist Sinn und Zweck der Trennung der Daten und der Views.
    Den Daten ist es wurscht wie sie angezeigt werden und dem View ist es wurscht wie die Daten aussehen, um genau diese Sachen kümmern sich die Kontroller
  • Ich meine das so:
    Aus deinem Code sehe ich, dass du dir aus der Plist ein Dictionary erstellst und dem Einträge hinzufügst. Aber du schreibst dieses Dictionary nicht in eine Plist zurück, das heisst, die Daten sind zwar temporär im Dictionary drin, aber nicht in der Plist. Beim nächsten Auslesen ist die Plist also wieder leer, weil du nie was hineingeschrieben hast. Müsstest über NSPropertyListSerialization das Dictionary wieder in die Plist schreiben.
  • Okay das klingt definitiv einleuchtend.
    Ich habe das jetzt so gemacht:

    Quellcode

    1. [dict1 writeToFile:plistPath atomically:YES];

    Allerdings kommt dann in der Konsole beim erneuten öffnen das: "Plist: (null)". Ich kann dann auch nichts mehr hinzufügen.
    Bevor ich den View verlasse, steht dann immer in der Konsole "Plist: { XYZ }".
    Den String "plistPath" musste ich auch als property deklarieren, weil er vorher in viewDidLoad erzeugt wurde und somit von der Funktion nicht erkannt wurde.
  • Ok also wenn ich tempDic ausgebe, kommt das:

    Quellcode

    1. TemporaryDic: {
    2. "Item 1" = {
    3. };

    Also ist in Dictionary Item 1 noch nichts vorhanden. Wenn ich dann aus der View rausgeh und wieder reingeh, ist im tempDic X = X. Das im tempDic wird also nicht geleert. Das Problem liegt dann bei writeToFile, aber ich wüsste nicht, was ich da jetzt falsch gemacht haben sollte.
  • johannesm schrieb:

    Okay das klingt definitiv einleuchtend.
    Ich habe das jetzt so gemacht:

    Quellcode

    1. [dict1 writeToFile:plistPath atomically:YES];

    Allerdings kommt dann in der Konsole beim erneuten öffnen das: "Plist: (null)". Ich kann dann auch nichts mehr hinzufügen.
    Bevor ich den View verlasse, steht dann immer in der Konsole "Plist: { XYZ }".
    Den String "plistPath" musste ich auch als property deklarieren, weil er vorher in viewDidLoad erzeugt wurde und somit von der Funktion nicht erkannt wurde.


    "writeToFile" gibt doch "YES" zurück wenn der Vorgang geklappt hat ?