NSUserDefaults und NSUserDefaultsController - unterschiedliches Verhalten bei KVC-Zugriff

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

  • NSUserDefaults und NSUserDefaultsController - unterschiedliches Verhalten bei KVC-Zugriff

    Ich lese in -awakeFromNib meines AppDelegates ein Dictionary aus einer Property List aus, in dem ich die "Standard User Defaults" setze. Die Property List ist ein Dictionary mit weiteren Dictionaries und Arrays. Die Daten werden dann per

    Quellcode

    1. [[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues];

    registriert.

    Ich will die Werte als Grundlage für Benutzerpräferenzen verwenden, zur leichteren Verwendung will ich Bindings verwenden. Das Problem ist, dass [NSUserDefaults standardUserDefaults] und [NSUserDefaultsController sharedUserDefaultsController] scheinbar ein unterschiedliches Verhalten haben (Aufruf direkt nach registrieren der Default Values):

    Quellcode

    1. NSLog(@"Test: %@", [[NSUserDefaults standardUserDefaults] valueForKeyPath:@"tableView.fields.aField.designation"]);
    2. NSLog(@"Test: %@", [[[[NSUserDefaultsController sharedUserDefaultsController] values] valueForKeyPath:@"tableView"] valueForKeyPath:@"fields.aField.designation"]);
    3. NSLog(@"Test mit Controller: %@", [[[NSUserDefaultsController sharedUserDefaultsController] values] valueForKeyPath:@"tableView.fields.aField.designation"]);

    Ausgabe:

    Quellcode

    1. Test: Bezeichnung
    2. Test: Bezeichnung
    3. Test mit Controller: (null)


    Woran liegt das? Ist es nicht zulässig, verschachtelte Dictionaries in den Standard User Defaults zu verwenden? (Wobei ein Toolbar-Autosave ja ebenso ein Dictionary anlegt...)
  • Hi, sorry für die späte Antwort.

    Ich habe das registerDefaults jetzt in +initialize vom NSApplicationDelegate.

    Leider bringt das aber immer noch das gleiche Verhalten. Hier jetzt mal der Code:

    Quellcode

    1. + (void)initialize
    2. {
    3. NSMutableDictionary *defaultValues = [NSMutableDictionary dictionary];
    4. NSMutableDictionary *tableViewDefaults = [NSMutableDictionary dictionaryWithContentsOfFile: someSourcePath];
    5. [defaultValues setObject:tableViewDefaults forKey:@"tableView"];
    6. // Read other dictionaries and add them to defaultValues
    7. [[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues];
    8. NSLog(@"Standard User Defaults Registered!");
    9. NSLog(@"Test: %@", [[NSUserDefaults standardUserDefaults] valueForKeyPath:@"tableView.fields.aField.designation"]);
    10. NSLog(@"Test: %@", [[[[NSUserDefaultsController sharedUserDefaultsController] values] valueForKeyPath:@"tableView"] valueForKeyPath:@"fields.aField.designation"]);
    11. NSLog(@"Test mit Controller: %@", [[[NSUserDefaultsController sharedUserDefaultsController] values] valueForKeyPath:@"tableView.fields.aField.designation"]);
    12. }
    Alles anzeigen


    Übrigens wird +initialize scheinbar zweimal hintereinander ausgeführt, zumindest tauchen die NSLogs von +initialize zweimal in der Konsole auf.

    Danke
    Christoph