SwiftUI 状态变量未更新

Posted

技术标签:

【中文标题】SwiftUI 状态变量未更新【英文标题】:SwiftUI State Variable Not Updating 【发布时间】:2020-02-07 07:28:15 【问题描述】:

我有一个 struct User 的爱好列表如下:

struct User: Hashable, Codable, Identifiable, Equatable 
    var id: String
    var name: String
    var hobbies: [String]

然后,我使用用户列表作为状态变量生成列表视图。当单击列表视图中的按钮时,新的爱好会添加到用户的爱好中。

struct UsersListView: View 

    @State var users: [User]


    var body: some View 

                TitleView(titleText: "Friends")
                    .padding(.leading, 30.0)

                List(userDisplayList)  user in
                     Text(user.name)
                     Text(user.hobbies.joined(separator: ", "))
                     Button(action: self.users[0].hobbies.append("new hobby")
                
            
        
    

但是,当我单击按钮时,用户状态变量不会改变并且保持不变。谁能解释这里发生了什么?

【问题讨论】:

为什么你不把你的用户包装在 Observableobject 中? 不会将它包装在 ObservableObject 中需要将其从结构转换为类,这可能会带来其他问题......?我认为类没有默认值和没有初始化器可能会有些复杂,他可能会试图避免。 【参考方案1】:

您在userDisplayList 中显示每个用户,而不是在users 中。

因此,当您更改 users 中的某些值时,SwiftUI 会认为您的视图中没有需要更新的内容,因为没有任何内容依赖于 users 变量。

如果您的userDisplayList 中没有其他逻辑,请尝试使用List(users) user in

【讨论】:

【参考方案2】:

试试这个:

    struct User: Hashable, Codable, Identifiable, Equatable 
    var id = UUID()
    var name: String
    var hobbies: [String]


struct UsersListView: View 

    @State var users: [User] = [User(name: "aaaa", hobbies: [])]


    var body: some View 

        List(users)  user in
                     Text(user.name)
                     Text(user.hobbies.joined(separator: ", "))
                        Button(action: 
                            self.users[0].hobbies.append("new hobby")
                        ) 
                            Text("Create hobby")
                        

                
            
        

【讨论】:

以上是关于SwiftUI 状态变量未更新的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI,为啥部分视图没有刷新? @State 变量未更新

SwiftUI @State 变量未更新

在 SwiftUI 中更新 CoreData 时更新状态变量

选择器更改时,SwiftUI 环境变量中的字符串插值未更新

SwiftUI 更新类子变量

异步firebase调用后SwiftUI不更新变量