2012-01-27 3 views
2

Можно ли сразу сохранить настройки на iPhone? Приложения на iOS 4+ не закрываются при выходе, и если я нажимаю «Stop process» в настройках Xcode, они не сохраняются? Как их сохранить?Как сохранить настройки на iPhone сразу?

- (void)compLoad { 
    compTotal = [[NSUserDefaults standardUserDefaults] integerForKey: @"compTotal"]; 
    compCount = [[NSUserDefaults standardUserDefaults] integerForKey: @"compCount"]; 
    compShow = [[NSUserDefaults standardUserDefaults] boolForKey: @"compShow"]; 
} 

- (void)compSave { 
    [[NSUserDefaults standardUserDefaults] setInteger: compTotal forKey: @"compTotal"]; 
    [[NSUserDefaults standardUserDefaults] setInteger: compCount forKey: @"compCount"]; 
    [[NSUserDefaults standardUserDefaults] setBool: compShow forKey: @"compShow"]; 
} 

ответ

7
- (void)compSave 
{ 
    [[NSUserDefaults standardUserDefaults] setInteger: compTotal forKey: @"compTotal"]; 
    [[NSUserDefaults standardUserDefaults] setInteger: compCount forKey: @"compCount"]; 
    [[NSUserDefaults standardUserDefaults] setBool: compShow forKey: @"compShow"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 
2

Просто позвоните [[NSUserDefaults standardUserDefaults] synchronize];. Но, как правило, вы делаете не: iOS сэкономит время, когда ваше приложение войдет в фон, а также в некоторых других случаях. Вызов synchronize слишком часто считается плохим (tm).

+0

NSUserDefaults правильно – Dmitry

+0

ли данные важны - это хорошая вещь) Спасибо за ответ. – Dmitry

+1

Поскольку 'synchronize' - правильное решение (я точно знаю, что я использовал NSUserDefaults в нескольких проектах за последние годы), ваша проблема должна быть в другом месте. Может быть, вы где-нибудь переписываете свои настройки? Например, если вы случайно вызываете 'compSave' перед' compLoad' при запуске приложения, вы снова получите «пустые» значения. Установите точку останова на 'compSave' и на' compLoad' и посмотрите, какой из них вызывается первым при запуске приложения. – DarkDust

6

В соответствии с документацией следующий вызов будет сохраняться в любых выдающихся модификациях. Чтобы проверить, выполнено ли это, проверьте возвращаемое значение этого вызова. Значение YES указывает на успех.

[[NSUserDefaults standardUserDefaults] synchronize]; 
+0

Можете ли вы дать больше информации о том, как он терпит неудачу? может помочь ваш код для настройки и получения значений по умолчанию для пользователя? – wattson12

1

Пробуйте использовать метод synchronize.

Update: Вы должны рассмотреть вопрос регистрации параметров по умолчанию, как это предлагает в Preferences and Settings Programming Guide:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Register the preference defaults early. 
    NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:@"CacheDataAgressively"]; 
    [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults]; 

    // Other initialization... 
} 

Кроме того, из этого руководства ("Синхронизация и Детектирование Предпочтение Изменения"), о синхронизации:

Чтобы определить, когда происходят изменения значения предпочтения, приложения также могут зарегистрироваться для уведомления NSUserDefaultsDidChangeNotification. Общий объект NSUserDefaults отправляет это уведомление вашему приложению, когда он обнаруживает изменение предпочтения, расположенного в одном из постоянных доменов. Вы можете использовать это уведомление, чтобы реагировать на изменения, которые могут повлиять на ваш пользовательский интерфейс. Например, вы можете использовать его для обнаружения изменений на предпочтительном языке пользователя и соответствующим образом обновлять контент вашего приложения.

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

+0

Все ответы не помогли! – Dmitry

3

Позвоните в compSave в вашем AppDelegate

- (void)applicationWillResignActive:(UIApplication *)application 
{ 
    // Call your compSave here to force saving before app is going to the background 
} 

также

- (void)compSave 
{ 
    [[NSUserDefaults standardUserDefaults] setInteger: compTotal forKey: @"compTotal"]; 
    [[NSUserDefaults standardUserDefaults] setInteger: compCount forKey: @"compCount"]; 
    [[NSUserDefaults standardUserDefaults] setBool: compShow forKey: @"compShow"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 
+0

Вы назвали ваш 'compSave' в методе AppDelegate, о котором я упоминал выше? –

+0

Я называю это после каждого изменения переменных. – Dmitry

Смежные вопросы