NSUserDefaults und Bindings

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

  • NSUserDefaults und Bindings

    Hallo,

    habe mal eine kurze Frage, die für Euch Profis vermutlich einfach zu beantworten ist. Ich arbeite mich gerade in NSUserDefaults ein und möchte gerne in meinem Prefs-Menü Bindings für die Einstellungen nutzen. Wenn ich dann ein paar Häkchen setze und ein paar Werte ändere, dann wird dies auch beim nächsten Öffnen des Fensters so wieder angezeigt.

    Wenn ich aber an anderer Stelle im Programm die Werte abfragen will, dann bekomme ich immer die Standardwerte, die ich am Anfang festgelegt habe. Ich benutze eine .plist-Datei. Hier ein bisschen Code:

    Im App-Delegate:

    Quellcode

    1. + (void)initialize {
    2. NSString *defaultsPath = [[NSBundle mainBundle] pathForResource: @"UserDefaults" ofType: @"plist"];
    3. NSDictionary *appDefaults = [NSDictionary dictionaryWithContentsOfFile:defaultsPath];
    4. [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
    5. }



    Wenn ich mir nun hier aber die Werte anzeigen lassen möchte, dann bekomme ich wie gesagt immer nur den Standard:

    Quellcode

    1. NSDictionary* visibleItems = [[NSUserDefaults standardUserDefaults] dictionaryForKey: @"studentViewVisOptions"];



    Als Anmerkung: die studentViewVisOptions sind in der plist ein Dictionary, das wiederum die BOOL-Werte für Keys enthält, die Spalten einer Tabelle ein- bzw. ausblenden.

    Ich hoffe, es kann mir geholfen werden.. :D
  • Dann probieren wir es mal: ich glaube mich dunkel zu erinnern dass ich mal ein ähnliches Problem hatte.

    Es war glaub ich dass man wohl [[NSUserDefaultsController sharedUserDefaultsController] defaults] nehmen muss, statt direkt auf den [NSUserDefaults standardUserDefaults] zuzugreifen (weil das unterschiedliche Objekte sind).
  • Hi,

    vielen Dank. Habe es gelöst. Hatte ja versucht per dictionaryForKey auf die Daten zu zu greifen. Das war wohl irgendwie der Fehler. Wenn ich einfach einen Key-Path bei objectForValue eingebe, dann geht es..

    Also statt:

    Quellcode

    1. NSDictionary* aDictionary;id value;aDictionary = [[NSUserDefaults standardUserDefaults] dictionaryForKey: @"someDictionary"];value = [aDictionary valueForKey: @"valueKey"];


    lieber so:

    Quellcode

    1. id value = [NSUserDefaults standardUserDefaults] objectForKey: @"someDictionary.valueKey"];
  • hns schrieb:

    Dann probieren wir es mal: ich glaube mich dunkel zu erinnern dass ich mal ein ähnliches Problem hatte.

    Es war glaub ich dass man wohl [[NSUserDefaultsController sharedUserDefaultsController] defaults] nehmen muss, statt direkt auf den [NSUserDefaults standardUserDefaults] zuzugreifen (weil das unterschiedliche Objekte sind).

    Laut Doku sollte es genau umgekehrt sein:
    NSUserDefaultsController is typically used when implementing your application’s preference window interface, or when you can bind a user interface item directly to a default value. NSUserDefaults remains the primary programmatic interface to your application’s default values for the rest of your application.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Ja, sehe ich auch so. Aber wo wir schon mal dabei sind. Es ist noch ein weiteres Problem aufgetreten. Wenn ich mein Preferences-Fenster mit "Abbrechen" schließe, sollen ja die Änderungen nicht übernommen werden. Das funktioniert irgendwie noch nicht so richtig. Meine Überlegung hierzu:

    - in awakeFromNib ein Property (NSDictionary) mit den alten Werten füttern:

    Quellcode

    1. self.oldSettings = [NSDictionary dictionaryWithDictionary: [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]];


    - bei cancelButtonClicked dann den Defaults die oldSettings zuweisen:

    Quellcode

    1. [[NSUserDefaults standardUserDefaults] registerDefaults: self.oldSettings];



    Bin ich da völlig auf dem Holzweg oder ist das prinzipiell der richtige Ansatz? Ich denke irgendwie, dass man die alten Werte erst lösche müsste, aber dafür scheint es ja keine Methode zu geben oder hab ich die übersehen?
  • Verstehe ich nicht ganz.

    a) Wieso arbeitest du in einem Preference-Window nicht mit Bindings?

    b) Willst du die Änderungen live durchführen? Dann wäre ein Cancel-OK-Paar m. E. nicht richtig

    c) Revert-Buton?

    Der Controller kennt bereits einen Mechanismus, um User-Defaults zurückzusetzen, IIRC, der genau dafür gedacht ist.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Sorry, wenn es nicht ganz verständlich war. Also ich öffne ein Prefs-Window. Klar kann ich mir die Standardwerte meiner Plist wiederholen. Das entspräche aber dann ja einem Reset. In dem Fenster arbeite ich mit Bindings. Wenn ich also irgendwo ein Häkchen setze, das vorher nicht gesetzt war und "OK" drücke, dann will ich natürlich, dass der entsprechende Wert nun dem angeklickten Häkchen entspricht. Wenn ich aber "Abbrechen" drücke, dann möchte ich ja die Einstellungen genau so haben, wie sie beim Öffnen des Fensters waren. Und dies entspricht ja nun nicht unbedingt den Default-Werten. Und nun die Frage, wie ich den Status beim Öffnen des Fensters speichern kann und diesen dann beim Abbrechen wieder setze.

    Also: Fenster öffnen -> Häkchen nicht gesetzt -> Häkchen anklicken -> OK -> Fenster schließt -> Fenster öffnen -> Häkchen gesetzt
    vs.: Fenster öffnen -> Häkchen nicht gesetzt -> Häkchen anklicken -> Abbrechen -> Fenster schließt -> Fenster öffnen -> Häkchen NICHT gesetzt
  • Jetzt verstehe ich Dich nicht. Ich hab die Value-Bindings der Häkchen etc. gesetzt. Was hat das mit OK/Cancel zu tun? Irgendwie muss ich dem User doch die Möglichkeit geben, das Fenster wieder zu schließen. Ich hab zwar keine Ahnung, wie es bei iTunes im Hintergrund aussieht, aber da ist es bei dem Prefs-Window so, wie es bei mir aussehen soll. Häkchen anklicken. OK. Häkchen ist beim nächsten Mal angeklickt. Häkchen anklicken. Cancel. Häkchen hat sich nicht verändert..
    Die Bindings setzen doch in diesem Fall nur die Werte in den Defaults. Aber mit revert werde ich es mal versuchen. Allerdings gehe ich dann ja wieder an den Controller.. Na ja, mal schauen..
  • alexlaske schrieb:

    Jetzt verstehe ich Dich nicht. Ich hab die Value-Bindings der Häkchen etc. gesetzt. Was hat das mit OK/Cancel zu tun? Irgendwie muss ich dem User doch die Möglichkeit geben, das Fenster wieder zu schließen. Ich hab zwar keine Ahnung, wie es bei iTunes im Hintergrund aussieht, aber da ist es bei dem Prefs-Window so, wie es bei mir aussehen soll. Häkchen anklicken. OK. Häkchen ist beim nächsten Mal angeklickt. Häkchen anklicken. Cancel. Häkchen hat sich nicht verändert..
    Die Bindings setzen doch in diesem Fall nur die Werte in den Defaults. Aber mit revert werde ich es mal versuchen. Allerdings gehe ich dann ja wieder an den Controller.. Na ja, mal schauen..


    Bindings synchronisieren automatisch. Da ist also OK zur Übernahme überflüssig.

    iTunes solltest du tunlichst nicht als Vorbild nehmen, da es wegen der Windows-Umgebung eben genau häufig das Look & Feel von OS X nicht unterstützt

    Ein Fenster kann man über den Schließbutton schließen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Die haben den überall vergessen! Da muss der Herr Jobs wohl nochmal ran.. *lol*
    Wird gemacht. Wie gesagt, prinzipiell klar. Und da die Bindings ja auch SOFORT in den Defaults stehen, ist es ja klar, dass die sich sofort synchronisiern. Ist ja auch der Sinn der Sache. Aber ich werde trotzdem nochmal den Guide durchlesen bzw. n paar Sachen nachschlagen.
  • naja,

    es gibt auch Einstellungen, die zwingend ein Ok oder Abbrechen benötigen. Das mußte wohl auch Mr. Jobs einsehen, denn...

    Nehmen wir z.B. mal das Umstellen der Sprache. Hier bekomme ich ein Fenster mit der Auswahl an Sprachen, setze dort das passende Häckchen und erst nach der Bestätigung mit OK, wird die neue Sprache geladen. Wäre anders ja auch recht doof, wenn ich bei jeder Auswahländerung in dem Fenster erstmal 10s warten muss, bis die entsprechende Sprache geladen ist.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Auch das ist ein Ansatz, den ich versuchen werde richtig umzusetzen, wenn ich es benötige. Für mein Window ist allerdings erstmal Amins Ansatz das, was ich brauche. Ich habe auf jeden Fall schon mal ne Menge Anregungen bekommen und habe mein Prefs-Window auch schon direkt mal seiner Buttons entledigt. Und wieder einmal ist es so, dass man sich die Sachen erst bewusst ansieht, wenn man darauf gestoßen wird. Das mit den (fehlenden) Buttons ist mir vorher irgendwie gar nicht aufgefallen..
  • Thallius schrieb:

    naja,

    es gibt auch Einstellungen, die zwingend ein Ok oder Abbrechen benötigen. Das mußte wohl auch Mr. Jobs einsehen, denn...

    Nehmen wir z.B. mal das Umstellen der Sprache. Hier bekomme ich ein Fenster mit der Auswahl an Sprachen, setze dort das passende Häckchen und erst nach der Bestätigung mit OK, wird die neue Sprache geladen. Wäre anders ja auch recht doof, wenn ich bei jeder Auswahländerung in dem Fenster erstmal 10s warten muss, bis die entsprechende Sprache geladen ist.

    Gruß

    Claus

    Der häufigste Grund ist allerdings, dass sich etwas nicht binden lässt.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • alexlaske schrieb:

    Auch das ist ein Ansatz, den ich versuchen werde richtig umzusetzen, wenn ich es benötige. Für mein Window ist allerdings erstmal Amins Ansatz das, was ich brauche. Ich habe auf jeden Fall schon mal ne Menge Anregungen bekommen und habe mein Prefs-Window auch schon direkt mal seiner Buttons entledigt. Und wieder einmal ist es so, dass man sich die Sachen erst bewusst ansieht, wenn man darauf gestoßen wird. Das mit den (fehlenden) Buttons ist mir vorher irgendwie gar nicht aufgefallen..

    Du kannst es so oder so machen. Was ich meinte: Du solltest dich für eins entscheiden.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?