Сохранение NSUserDefaults при выходе из приложения

Я хочу автоматически сохранять кучу NSUserDefaults, когда пользователь закрывает приложение с помощью кнопки «Домой», а не при нажатии кнопки сохранения (это все, что мне удалось найти до сих пор). Как лучше всего это сделать?

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

Я нашел this, в котором говорится о таких методах, как applicationWillTerminate: и applicationWillResignActive:, но я не совсем уверен, как их реализовать.

Я установил pointSize на 18 по умолчанию, но когда я увеличу это:

@IBAction func largerTextButton(sender: AnyObject) {
    mainTextView.font =  UIFont(name: mainTextView.font.fontName, size: mainTextView.font.pointSize+1)
    println(mainTextView.font.pointSize)
}

И сохраните его следующим образом:

func applicationWillResignActive(application: UIApplication) {
    userDefaults.setObject(mainTextView.font.pointSize, forKey: "textSize")
    userDefaults.synchronize()
}

func applicationWillTerminate(application: UIApplication) {
    userDefaults.setObject(mainTextView.font.pointSize, forKey: "textSize")
    userDefaults.synchronize()
}

Он отлично сохраняет, когда я добавляю этот код к кнопке, но не сохраняет в applicationWillResignActive и applicationWillTerminate, так что это не проблема с самим сохранением. Скорее методы applicationWillResignActive и applicationWillTerminate, с которыми у меня проблемы.

В следующий раз, когда я запускаю приложение, я все равно получаю 18, используя это для проверки:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    println(toString(userDefaults.objectForKey("textSize")))
    ...

person Luke Martin    schedule 30.07.2015    source источник
comment
они уже реализованы в AppDelegate. Просто добавьте свои методы для сохранения   -  person meth    schedule 30.07.2015


Ответы (1)


Вы можете использовать эти два метода или даже didEnterBackground, которые находятся в делегате приложения, и просто вызвать.

[NSUserDefaults standardUserDefaults].synchronize
person Beau Nouvelle    schedule 30.07.2015
comment
Я пробовал использовать userDefaults.setObject(mainTextView.font.pointSize, forKey: "textSize") и userDefaults.synchronize() в обоих упомянутых мною методах (см. Правку, которую я внес в исходный вопрос), но все равно получаю 18? - person Luke Martin; 30.07.2015
comment
Это в симуляторе. Правильно ли вы останавливаете приложение? Простое нажатие кнопки запуска или остановки в Xcode приводит к существенному сбою приложения, и эти методы никогда не будут вызваны. - person Beau Nouvelle; 30.07.2015
comment
Я попытался остановиться с помощью кнопки остановки, закрыть приложение через многозадачное меню и вернуться на главный экран с помощью кнопки «Домой» на симуляторе и на моем собственном iPhone. Ни один из них не сохранил ни одного установленного мной NSUserDefaults. Я не думаю, что вызываются методы applicationWillResignActive или applicationWillTerminate. Неужели я что-то там пропустил? - person Luke Martin; 30.07.2015
comment
Вы говорите, что установили размер точки по умолчанию. Единственное, о чем я могу думать, это то, что вы снова устанавливаете это значение при следующей загрузке на 18. Кроме этого. Без понятия. Скорее всего где-то небольшая глупая ошибка, может быть, опечатка? - person Beau Nouvelle; 30.07.2015