Запазване на NSUserDefaults, когато приложението излезе

Искам автоматично да запазя куп NSUserDefaults, когато потребителят затвори приложението с бутона за начало, а не когато натисне бутон за запазване (което е всичко, което успях да намеря досега). Какъв би бил най-добрият начин да направите това?

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

Намерих това, което говори за методи като 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