Я использую @AppStorage, чтобы сохранить некоторые предпочтения в представлении настроек, как рекомендует Apple: https: / /developer.apple.com/documentation/swiftui/settings

У меня также есть главное окно, и оно будет читать некоторые предпочтения перед тем, как пользователь откроет представление настроек, а затем кажется, что я прочту «неправильные» значения UserDefaults, потому что ожидаемые значения не записываются в UserDefaults, потому что представление настроек еще не загружено.

Например:

// Settings view
struct SettingsView: View {
   @AppStorage("x") var x = 5  // give preference a default value
   ...
}

// Main view
struct MainView: View {

    func foo() {
        let x = UserDefaults.standard.double(forKey: "x")
        // x is not the default value I expect
    }
}

Возможные решения, которые я знаю:

  1. При запуске приложения проверьте, равно ли значение UserDefaults нулю, если да, запишите их со значениями по умолчанию.
  2. При чтении UserDefaults проверьте, равно ли UserDefaults нулю, если да, то вместо этого прочтите значения по умолчанию.

Есть ли лучшие способы справиться с этим? Спасибо!

0
Zieng 22 Фев 2021 в 03:09

1 ответ

Лучший ответ

UserDefaults предоставляет метод под названием register, который загружает его значениями по умолчанию (без каламбура). Эти значения используются только в

Я считаю полезным заполнить его значениями из списка в пакете приложений в моем AppDelegate при запуске приложения (например, в didFinishLaunchingWithOptions - при использовании жизненного цикла SwiftUI вы все равно можете сделать это: Жизненный цикл приложения SwiftUI iOS14, где разместить код AppDelegate?):

if let prefs = Bundle.main.path(forResource: "defaults", ofType: "plist"), 
    let dict = NSDictionary(contentsOfFile: prefs) as? [String : Any] {
  UserDefaults.standard.register(defaults: dict)
}

https://developer.apple.com/documentation/foundation/userdefaults/1417065-register

Из документов:

Содержимое регистрационного домена не записывается на диск; вам необходимо вызывать этот метод каждый раз при запуске приложения . Вы можете поместить файл plist в каталог ресурсов приложения и вызвать регистр (по умолчанию :) с содержимым, которое вы читаете из этого файла.

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

0
jnpdx 22 Фев 2021 в 00:20