gpt4 book ai didi

ios - ObservableObject 不更新 View

转载 作者:行者123 更新时间:2023-12-01 21:30:09 26 4
gpt4 key购买 nike

我对 SwiftUI 很陌生(而且我也有一段时间没有接触过 Swift)所以请耐心等待:
我有这样的看法:

import SwiftUI
import Combine
var settings = UserSettings()


struct Promotion: View {
@State var isModal: Bool = true
@State private var selectedNamespace = 2
@State private var namespaces = settings.namespaces

var body: some View {
VStack {
Picker(selection: $selectedNamespace, label: Text("Namespaces")) {
ForEach(0 ..< namespaces.count) {
Text(settings.namespaces[$0])

}
}
}.sheet(isPresented: $isModal, content: {
Login()
})
}
}
我在这里所做的是在启动、登录时调用登录 View ,当成功时,我设置
变量设置
这样在 LoginView
settings.namespaces = ["just", "some", "values"]
我的 UserSettings 类是这样定义的
class UserSettings: ObservableObject {
@Published var namespaces = [String]()
}
根据我最近获得的知识,我的登录 View 正在设置我的 UserSettings 类的命名空间属性。由于此类是 ObservableObject,因此使用该类的任何 View 都应更新以反射(reflect)更改。
但是,我的 Picker 仍然是空的。
那是因为根本的误解,还是我只是少了一个逗号?

最佳答案

您必须配对 ObservableObjectObservedObject在 View 中,因此 View 会收到有关更改的通知并刷新。
尝试以下

struct Promotion: View {
@ObservedObject var settings = UserSettings() // << move here

@State var isModal: Bool = true
@State private var selectedNamespace = 2
// @State private var namespaces = settings.namespaces // << not needed

var body: some View {
VStack {
Picker(selection: $selectedNamespace, label: Text("Namespaces")) {
ForEach(namespaces.indices, id: \.self) {
Text(settings.namespaces[$0])

}
}
}.sheet(isPresented: $isModal, content: {
Login(settings: self.settings) // inject settings
})
}
}


struct Login: View {
@ObservedObject var settings: UserSettings // << declare only !!

// ... other code
}

关于ios - ObservableObject 不更新 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63088646/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com