【问题标题】:Cannot assign to property: 'self' is immutable in SettingView无法分配给属性:“自我”在 SettingView 中是不可变的
【发布时间】:2021-02-09 18:53:54
【问题描述】:

我正在创建一个页面 settingView 来保存用户数据,我在其中使用 @ObservedObject 调用一个类。 我还在settingView页面中做了一些函数来加载和保存用户数据。 但是我收到错误“无法分配给属性:'self' 在 SettingView 中是不可变的”。我该如何解决这个问题。

class UserData: ObservableObject, Codable {
    @Published var name = ""
    @Published var firstname = ""
    @Published var email = ""
}

struct SettingsView: View {
    @ObservedObject var userdata = UserData()

var body: some View {
        
        NavigationView{
            Form {
                Section(header: Text("User")){
                    TextField("Name", text: $userdata.name)
                    TextField("Firstname", text: $userdata.firstname)
                    TextField("Email...", text: $userdata.email)
                   //more code
                }
                Section{
                    Button(action: {
                        self.saveData()
                        self.showingAlert = true
                    }){
                        Text("Save")
                    }
            }
        }

        .onAppear(perform: {
            self.loadData()
        })
    }
    
    func getDocumentsDirectory() -> URL {
        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        return paths[0]
    }
    
    func loadData() {
        let filename = getDocumentsDirectory().appendingPathComponent("SavedData")

        do {
            let data = try Data(contentsOf: filename)
            userdata = try JSONDecoder().decode(UserData.self, from: data) <-- error on userdata
            print("File is loaded")
        } catch {
            print("Unable to load saved data.")
        }
    }
}

【问题讨论】:

    标签: swiftui


    【解决方案1】:

    您不能分配给 ObservedObject。 ObservableObject 是一个修改自身的对象,当它修改时,它会通知观察者。因此,通常您会将其实现为 userData.load(from: filename),并让 UserData 完成所有工作,而不是重新分配 userData。为了使其正常工作,您需要包装您正在解码的结构(它不能自行替换)。因此,您的 ObservableObject 可能类似于“DataStore”,它拥有一个 UserData。

    【讨论】:

    • 所以你说我必须为从 UserData 到 userdata 的 DataStore 做一个额外的函数?
    • 我的意思是,如果你想要一个 ObservableObject,它应该是你观察到的持久(而不是替换)对象,并且对于你想要观察的所有事物都具有 @Published 属性。您可以通过多种方式实现。一种是加载单个 UserData 对象并将其公开为@Published
    猜你喜欢
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 2018-01-08
    相关资源
    最近更新 更多