[英]State not updating to another view in swiftUI
我正在使用它来将用户信息保存在用户 isRegsitered 的用户默认值中。
struct UserKeys {
static let isUserRegistered = "isUserRegistered"
}
@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)
}
}
}
final class UserSettings: ObservableObject {
let objectWillChange = PassthroughSubject<Void, Never>()
@UserDefault(UserKeys.isUserRegistered, defaultValue: false)
var isUserRegistered: Bool {
willSet {
objectWillChange.send()
}
}
}
// 同一仪表板视图上的弹出登录 window。
struct PopUpWindow: View {
@ObservedObject var userRepo = UserSettings()
Button(action: {
// Dismiss the PopUp
withAnimation(.linear(duration: 0.3)) {
userRepo.isUserRegistered = true
show = false
hideKeyboard()
}
}, label: {
Text("Submit")
& 此外,我在 DashBoardView 视图中列出 -
struct DashBoardView: View {
@ObservedObject var userRepo = UserSettings()
private var content: some View {
if !userRepo.isUserRegistered {
return PopUpWindow(show: .constant(true)) .eraseToAnyView()
}
// .. Other conditions ..
所以基本上我弹出了登录框,所以在提交后我试图关闭对话框并想听值userRepo.isUserRegistered
通过在PopUpWindow
和DashBoardView
中独立初始化UserSettings
class ,您实际上是在说每个视图都在管理自己的数据,因此两个视图不共享相同的数据。
您不应该从PopUpWindow
视图初始化您的UserSettings
class ,而是从DashBoardView
传递一个实例。 代码如下所示:
弹出窗口
struct PopUpWindow: View {
@ObservedObject var userRepo: UserSettings
Button(action: {
// Dismiss the PopUp
withAnimation(.linear(duration: 0.3)) {
userRepo.isUserRegistered = true
show = false
hideKeyboard()
}
}, label: {
Text("Submit")
// .. Other conditions ..
接着:
仪表板视图
struct DashBoardView: View {
@ObservedObject var userRepo = UserSettings()
private var content: some View {
if !userRepo.isUserRegistered {
return PopUpWindow(userRepo: userRepo, show: .constant(true)) .eraseToAnyView()
}
// .. Other conditions ..
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.