swiftui - 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()
}
但我收到一个错误:
不能对不可变值使用变异成员:“用户”是“让”常量
如何将用户的值更改为变量?
我希望我能很好地解释我的问题。
谢谢您的帮助!
解决方案
这是可能的方法
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()
}
}
推荐阅读
- javascript - 为什么我不能在 useEffect 之外创建订阅?
- css - 如何通过一些装饰将 div 放入更大的 div 中?
- ag-grid - Ag Grid 错误:找不到 bean 引用 focusController
- php - 无法使用 laravel 应用程序和 unix 套接字从应用程序引擎 php 标准环境连接到云 mysql
- java - 在运行时使用 Eclipse 编译外部 Java 文件
- google-apps-script - 如何在 Google 表格的 3 张表格之间有条件地移动行?
- javascript - 根据布尔值更改几个CSS
- python - 从 Python (ctypes) 向 PARI/GP 发送多项式
- python - 我正在尝试排序并设置一个字符串以查看它是否与字母表匹配。如果是,我想返回 True 但它返回 False
- react-player - 用户点击缩略图后保持 react-player 灯光模式