2013-03-09 3 views
0

Я понимаю, что есть несколько вопросов о том, где хранить userDefaults, чтобы они были доступны всем. В настоящее время у меня есть в AppDelegate, и он работает. Однако теперь я хочу обновить настройку по умолчанию для каждого пользователя.Где я должен хранить NSUserDefaults, чтобы обновить их?

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

#import "AppDelegate.h" 

@implementation AppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Override point for customization after application launch. 

    NSUserDefaults *sharedPref = [NSUserDefaults standardUserDefaults]; 
    [sharedPref setObject:@"Washington, DC" forKey:@"defaultLocation"]; 
    // 

    return YES; 
} 

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

Как вы можете установить значение по умолчанию, а затем разрешить пользователю изменять его без него, а затем перезаписывать при запуске приложения?

Благодаря

+1

Это то, что registerDefaults для. Когда вы регистрируете значение по умолчанию, оно только записывает их, если по умолчанию этот ключ еще не существует. – rdelmar

+1

@rdelmar 'registerDefaults' ничего не пишет. Когда вы пытаетесь получить значение из 'NSUserDefaults', если значение для ключа было явно задано, это значение возвращается. Если для ключа нет значения, то для ключа отмечены зарегистрированные значения по умолчанию. – rmaddy

+0

@rmaddy, спасибо за эту коррекцию. Я работал под непониманием работы registerDefaults. Я должен был прочитать документацию немного ближе. – rdelmar

ответ

1

Следующий код запускает проверку, было ли или не было запущенно приложение. Он предназначен для замены -registerDefaults:.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    if(![[NSUserDefaults standardUserDefaults] boolForKey:@"setupApp"]) 
     { 
      NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
      [defaults setBool:YES forKey:@"setupApp"]; 
      [defaults setObject:@"Washington, DC" forKey:@"defaultLocation"]; 

      [defaults synchronize]; 
     } 
    return YES; 
} 
+0

Через несколько минут после того, как я написал это, я нашел жизнеспособный ответ, похожий на ваш. Теперь я выполняю проверку, чтобы убедиться, что приложение было запущено в первый раз, и это единственный раз, когда они установлены, что позволяет пользователю их обновлять. Спасибо –

+0

Проголосовать .. спасибо, почему? –

+2

Этот подход не так прост и чист, как использование 'registerDefaults:'. Этот код добавляет дополнительную проверку, которая будет полезна только один раз, и добавляет ненужное дополнительное значение в 'NSUserDefaults'. – rmaddy

0

NSUserDefaults - одноэлементный, доступный для всего приложения. Вы можете назвать это в любое время:

[NSUserDefaults standardUserDefaults] 

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

[[NSUserDefaults standardUserDefaults] setObject:@"Some Value" forKey:@"MyKey"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; // to save 

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

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

Ref

+2

Вам не нужно вызывать 'synchronize' после установки значения. ОС будет постоянно обновлять значения. Единственное место, которое вы должны вызвать 'synchronize', находится в методе делегирования приложения applicationDidEnterBackground. – rmaddy

4

Вы должны использовать registerDefaults: для этого

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
// ... 
    [NSUserDefaults standardUserDefaults] registerDefaults:@{@"defaultLocation" : @"Washington, DC"}]; 
// ... 
    return YES; 
}