我对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()
})
}
}我在这里所做的是,在启动、登录时调用登录视图,当成功时,我将
var设置
在LoginView中也是如此
settings.namespaces = ["just", "some", "values"]我的UserSettings类被定义为
class UserSettings: ObservableObject {
@Published var namespaces = [String]()
}根据我最近获得的知识,我的Login视图正在设置我的UserSettings类的名称空间属性。因为这个类是一个ObservableObject,所以使用该类的任何视图都应该更新以反映更改。
然而,我的选择仍然是空的。
这是因为根本的误解,还是我只是缺了一个逗号之类的?
发布于 2020-07-25 13:13:25
您必须将ObservableObject与视图中的ObservedObject配对,以便通知视图更改和刷新。
尝试以下几点
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
}https://stackoverflow.com/questions/63088646
复制相似问题