首页 > 解决方案 > SwiftUI 通过点击更改列表中的值

问题描述

我今天正在努力解决一些问题,但我找不到一个好的解决方案。我有一个简单的类(用户),它有一些属性,而其他类(用户容器)作为 ObservableObject,有一个第一类的数组:

struct User: Identifiable {
    let id = UUID()
    var name: String
    var isActive: Bool
}

class UsersContainer : ObservableObject{
    @Published var users = [User]()
    
    init() {
        users = [User(name: "John", isActive: true), User(name: "Paul", isActive: true), User(name: "Jack", isActive: false)]
    }
}

在我的 ContentView 中,我有一个列表,其中显示了用户的名称,并根据用户是否处于活动状态来更改颜色和删除线:

struct ContentView: View {
    
    @ObservedObject var usersContainer = UsersContainer()
    
    var body: some View {
        VStack{
            List(usersContainer.users, id: \.id){user in
                Text(user.name)
                    .strikethrough(!user.isActive)
                    .foregroundColor(user.isActive ? Color.black : Color.gray)
                    .onTapGesture {
                        print("Tap")
                    }
            }
        }
    }
}

模拟器上的结果是我所期望的:

模拟器截图

我的问题出在 ContentView 中的 TapGesture 上。当用户使用以下代码点击行时,我想更改行:

.onTapGesture {
      user.isActive.toggle()
}

但我收到一个错误:

不能对不可变值使用变异成员:“用户”是“让”常量

如何将用户的值更改为变量?

我希望我能很好地解释我的问题。

谢谢您的帮助!

标签: swiftui

解决方案


这是可能的方法

List(Array(usersContainer.users.enumerated()), id: \.1.id) { index, user in
    Text(user.name)
        .strikethrough(!user.isActive)
        .foregroundColor(user.isActive ? Color.black : Color.gray)
        .onTapGesture {
           self.usersContainer.users[index].isActive.toggle() 
        }
}

推荐阅读