Где разместить метод .register(), чтобы установить начальное / значение по умолчанию для пользовательских ошибок?

#ios #swiftui #userdefaults

#iOS #swiftui #пользовательские ошибки

Вопрос:

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

Вот где я попытался инициализировать его в файле «App», который Xcode сгенерировал вместе с проектом:

 import SwiftUI

@main
struct TestApp: App {

    init() {
        //Sets default values for the user defaults that have not yet been set and should not return 0/false
        UserDefaults.standard.register(defaults: [
                "selectedRoundLength": 1
            ]
        )
    }

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
 

Однако, похоже, это на самом деле не помогает. У кого-нибудь есть данные по этому вопросу?

Комментарии:

1. Каким образом это не работает?

Ответ №1:

Это init вызывается до UIApplication того, как оно было настроено, поэтому, если вы хотите зарегистрировать значения по умолчанию (что можно сделать из списка большого словаря), это должно быть сделано с помощью адаптера делегата приложения.

 class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {

        // Register defaults here !!
        UserDefaults.standard.register(defaults: [
                "selectedRoundLength": 1
                // ... other settings
            ]
        )

        return true
    }
}

@main
struct TestApp: App {

    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
 

Ответ №2:

Если ваша минимальная цель — iOS 14, вы можете использовать @AppStorage для сохранения вашего значения UserDefaults и начать с начального значения. Вам не нужно добавлять это @AppStorage значение в @main , чтобы инициализировать его. Вы можете просто вызвать его в любом представлении или Observable классе SwiftUI, где вам это действительно нужно. Он будет иметь это начальное значение, если оно не было сохранено.

 import SwiftUI

@main
struct TestApp: App {

  // This is UserDefaults starting in iOS 14.
  @AppStorage("selectedRoundLength") var selectedRoundLength = 1

  var body: some Scene {
    WindowGroup {
      ContentView()
    }
  }
}