swift - 在swiftui中修改项目类后ListView不更新
问题描述
我有一个任务项目的列表视图。每 10 秒一个计时器触发函数 randomTasks 负责修改列表中每个任务的标题和描述,但 ListView 不反映更改。我尝试使用 objectWillChange.send() 但它不起作用.
我注意到,当使用不同的 id 修改任务时,ListView 会更新,我可以看到更改,但是当我在详细视图中时,只要触发 randomTaskTitle,视图就会自动关闭。
class Task {
var id: String = UUID().uuidString
var title: String
var description: String
init(title: String, description: String) {
self.title = title
self.description = description
}
}
import SwiftUI
struct TasksView: View {
@EnvironmentObject var viewModel: TasksViewModel
let timer = Timer.publish(every: 10, on: .main, in: .common).autoconnect()
var body: some View {
NavigationView {
List {
ForEach(viewModel.tasks, id: \.id) { task in
NavigationLink(
destination: DetailView(task: task)
) {
VStack {
Text(task.title)
Text(task.description)
}
}
}
}
.onReceive(timer) { time in
Task {
await viewModel.randomTasks()
}
}
}
}
struct TasksViewNew_Previews: PreviewProvider {
static var previews: some View {
TasksView()
}
}
import Foundation
@MainActor
class TasksViewModel: ObservableObject {
@Published var tasks = [Task]()
init() {
self.tasks = [Task(title: "TaskA", description: "DescriptionA"),
Task(title: "TaskB", description: "DescriptionB"),
Task(title: "TaskC", description: "DescriptionC"),
Task(title: "TaskD", description: "DescriptionD"),]
}
func randomTasks() {
tasks.forEach { task in
task.title = randomTitleTask()
task.description = randomDescriptionTask()
}
}
}
解决方案
类中的@Published
数组不知道您的对象何时更改。它只能跟踪您何时添加/删除它们。
- 您可以通过在修改之前
ObservableObject
调用来明确地告诉您某些内容已更改objectWillChange.send()
objectWillChange.send()
tasks.forEach { task in
task.title = UUID().uuidString
task.description = UUID().uuidString
}
- 将您的类转换为结构,并按索引更改项目,例如
tasks.indices { i in
tasks[i].title = UUID().uuidString
tasks[i].description = UUID().uuidString
}
- 看看
ObservableArray
这个答案
推荐阅读
- c# - Winforms TreeView with OwnerDrawText:“DrawDefault = true”部分遮盖/绘制复选框
- swift - TableViewController 没有出现在模拟器中
- ios - 键盘在 XCode 中的 DarkMode 中不会改变外观 [Objective C]
- vuejs2 - 我可以更改 Nuxt 中命名中间件的默认位置吗?
- python - 试图让游戏使用python检测鼠标点击,所有库都失败了
- xcode - Flutter 模拟器错误:命令 PhaseScriptExecution 失败,退出代码为非零
- excel - 如何使用 VBA 计算 Excel 表格中的列数?
- gstreamer - 带有幽灵垫的 Gstreamer“更改管道中的元素”示例
- android - 无法向 Mainactivity 添加操作,因为它不支持操作
- power-automate - 使用 OAuth 2.0 令牌的 Power Automate API 调用