我对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()
        })
    }
}
我在这里要做的是在启动,登录后调用“登录”视图,成功后,我将
变量设置
如在LoginView中
settings.namespaces = ["just", "some", "values"]
我的UserSettings类是这样定义的
class UserSettings: ObservableObject {
    @Published var namespaces = [String]()
}
根据我最近获得的知识,我的“登录”视图正在设置UserSettings类的namespaces属性。由于此类是ObservableObject,因此使用该类的任何视图都应更新以反映更改。
但是,我的选择器仍然为空。
是因为根本的误解,还是我只是想念一个逗号?

最佳答案

您必须在视图中将ObservableObjectObservedObject配对,以便通知视图更改并刷新。
尝试以下

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
}

07-24 09:17