#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()
}
}
}