SwiftUI устанавливает строковое значение внутри UserDefaults, но как ʻEnvironmentObject`
Здравствуйте, существует простой способ поместить значения в UserDefaults как EnvironmentObject
для отображения в других представлениях? Что-то вроде установки имени пользователя в SettingsView и отображения в DashboardView. Большое спасибо
1 ответ
Наконец-то найди. Как мне использовать UserDefaults с SwiftUI?
Ответ основан только на Bool
. Ее решение сделать это сString
слишком.
ContentView, настроенный с помощью TabView:
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
TabView{
Dashboard(userName: UserName())
.tabItem({
Image(systemName: "rectangle.3.offgrid")
Text("Dashboard")
})
Settings()
.tabItem({
Image(systemName: "gear")
Text("Einstellungen")
})
}
}
}
}
#if DEBUG
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
#endif
UserSettings для Bool и UserName для String
import SwiftUI
import Combine
final class UserSettings: ObservableObject {
let objectWillChange = PassthroughSubject<Void, Never>()
@UserDefault("ShowOnStart", defaultValue: true)
var showOnStart: Bool {
willSet {
objectWillChange.send()
}
}
}
final class UserName: ObservableObject {
let objectWillChange = PassthroughSubject<Void, Never>()
@UserDefault("userName", defaultValue: "UknowName")
var userNameSet: String {
willSet {
objectWillChange.send()
}
}
}
Свойство Wrapper UserDefaults, используемое в UserSettings и UserName class
@propertyWrapper
struct UserDefault<T> {
let key: String
let defaultValue: T
init(_ key: String, defaultValue: T) {
self.key = key
self.defaultValue = defaultValue
}
var wrappedValue: T {
get {
return UserDefaults.standard.object(forKey: key) as? T ?? defaultValue
}
set {
UserDefaults.standard.set(newValue, forKey: key)
}
}
}
На панели инструментов First View представлены изменения, внесенные в представление настроек.
import SwiftUI
struct Dashboard: View {
@ObservedObject var settings = UserSettings()
@ObservedObject var userName = UserName()
var body: some View {
VStack{
Text("hallo")
ExtractedViewName(userName: userName)
ExtractedView(settings: settings)
}
}
}
struct Dashboard_Previews: PreviewProvider {
static var previews: some View {
Dashboard(userName: UserName())
}
}
struct ExtractedView: View {
@ObservedObject var settings : UserSettings
var body: some View {
VStack{
if settings.showOnStart{
Text("Welcome")
}
}
}
}
struct ExtractedViewName: View {
@ObservedObject var userName : UserName
var body: some View {
Text("Test One: \(userName.userNameSet)")
}
}
Настройки второго вида устанавливают изменения, которые отображаются в представлении панели инструментов.
import SwiftUI
struct Settings: View {
@ObservedObject var settings = UserSettings()
@ObservedObject var userName = UserName()
@State private var userTextfield = ""
var body: some View {
VStack {
Toggle(isOn: $settings.showOnStart) {
Text("Show welcome text")
}
TextField("Name", text: $userTextfield){
self.userName.userNameSet = self.userTextfield
}
Button(action: {
print("\(self.userName.userNameSet)")
}) {
Text("Button")
}
}
}
}
struct Settings_Previews: PreviewProvider {
static var previews: some View {
Settings()
}
}