您好,是否存在一种将值放入 UserDefaultsEnvironmentObject
以在其他视图中显示的简单方法?在 SettingsView 中设置用户名并显示在 DashboardView 中。多谢
问问题
209 次
1 回答
1
终于找到了如何在 SwiftUI 中使用 UserDefaults?
答案仅基于Bool
. 她也是解决方案String
。
使用 TabView 设置的 ContentView:
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
Bool 的 UserSettings 和 String 的 UserName
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()
}
}
}
在 UserSettings 和 UserName 类中使用的 Property Wrapper UserDefaults
@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)
}
}
}
那里的第一个视图仪表板显示了在设置视图中所做的更改
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()
}
}
于 2020-02-06T22:21:50.193 回答