NSUserDefaults сбрасывается на зарегистрированныйDefaults

У меня есть default, называемый showguidelines, который является ли пользователь хочет, чтобы рекомендации отображались при перетаскивании элементов в документе.

Настройка и запрос по умолчанию с использованием моих двух вспомогательных методов ниже отлично подходит для жизни приложения. Но как только приложение перезагружается, я получаю странные проблемы.

Что происходит, так это.

  1. Я установил showguidelines как NO.
  2. Я заново запускаю приложение.
  3. После вызова registerDefaults я проверяю, что showguidelines все еще нет. ([AppPreferences registerDefaults] вызывается из инициализации в делегате приложения.)
  4. В следующий раз, когда я запрашиваю для showguidelines, я получаю ДА (который является зарегистрированнымDefault).
  5. Странно, что у меня есть NSMenuItem, связанный с showguidelines, и он всегда уважает правильное (ожидаемое) значение. (НЕТ в этом случае).

Я уже подтвердил, что значение никогда не устанавливается в ДА в другом месте приложения, добавив наблюдателя в [NSUserDefaults standardUserDefaults] для ключевого showguidelines. Это также не проблема синхронизации, потому что я подтвердил при запуске приложения, что это значение правильно.

Любая идея, что я могу делать неправильно?

// AppPreferences.m
#import "AppPreferences.h"
@implementation AppPreferences
+ (void)registerDefaults { NSURL *defaultPrefsFile = [[NSBundle mainBundle] URLForResource:@"DefaultPreferences" withExtension:@"plist"]; NSDictionary *defaultPrefs = [NSDictionary dictionaryWithContentsOfURL:defaultPrefsFile]; [[NSUserDefaults standardUserDefaults] registerDefaults:defaultPrefs]; NSLog(@"-register: %@", [PCAppPreferences showsGuidelines] ? @"YES" : @"NO");
}
#pragma mark - showsGuidelines
+ (BOOL)showsGuidelines { return [[NSUserDefaults standardUserDefaults] boolForKey:@"showsguidelines"];
}
+ (void)setShowsGuidelines:(BOOL)showsGuidelines { NSLog(@"-set showsguidelines: %@", [[NSUserDefaults standardUserDefaults] boolForKey:@"showsguidelines"] ? @"YES" : @"NO"); [[NSUserDefaults standardUserDefaults] setBool:showsGuidelines forKey:@"showsguidelines"]; [[NSUserDefaults standardUserDefaults] synchronize];
}
@end
// Called on App Launch
2014-03-26 14:27:53.035 AppName[30636:303] -set showsguidelines: NO
2014-03-26 14:27:53.035 AppName[30636:303] -register: NO
// Called shortly afterward
2014-03-26 14:27:58.324 AppName[30636:303] -set showsguidelines: YES
2014-03-26 14:27:58.325 AppName[30636:303] -set showsguidelines: YES
2014-03-26 14:27:58.342 AppName[30636:303] -set showsguidelines: YES
1 ответ

Убедитесь, что вы фактически выходите из приложения, а не просто "Запускаете" обновленную версию из Xcode. В противном случае значения по умолчанию не записываются. Таким образом, вы запускаете приложение без по умолчанию (которое по умолчанию равно NO), а не фактическое значение NO умолчанию. Поэтому, когда вы регистрируете значения по умолчанию, он видит, что для этого имени нет значения по умолчанию, и теперь зарегистрированный дефолт берет верх, и он становится YES.

Вы всегда можете использовать значения командной строки по defaults read my.app.identifier чтобы проверить defaults read my.app.identifier значения по умолчанию.

licensed under cc by-sa 3.0 with attribution.