【发布时间】:2020-06-24 23:56:18
【问题描述】:
我有一个 ScrollView,它使用数组中的 ForEach 循环显示行列表。当我从数组中删除一个项目时,我收到错误:索引超出范围。
ScrollView {
ForEach(viewModel.tasks.indices, id: \.self){ index in
TaskRow(
task: self.$viewModel.tasks[index],
deleteAction: {
self.viewModel.deleteTask(task: self.viewModel.tasks[index])
}
)
}
}
此错误仅在我切换到从 ForEach 循环而不是“任务”本身传递索引时才开始发生。我必须这样做才能在子视图中使用@Binding var task: Task:“TaskRow”
“删除操作”由子视图中的按钮触发。
viewModel.deleteTask 的工作方式如下(使用数据管理器):
final class StackDetailViewModel: ObservableObject {
@Published var tasks = [Task]()
var dataManager: DataManagerProtocol
init(dataManager: DataManagerProtocol = DataManager.shared){
self.dataManager = dataManager
fetchTasks()
}
}
extension StackDetailViewModel {
func fetchTasks() {
tasks = dataManager.fetchTasks()
}
func deleteTask(task: Task) {
dataManager.deleteTask(task: task)
fetchTasks()
}
}
dataManager 在哪里执行此操作:
Class DataManager {
...
private var tasks = [Task]()
...
func fetchTasks() -> [Task] {
tasks
}
func deleteTask(task: Task) {
if let index = tasks.firstIndex(where: { $0.id == task.id }) {
tasks.remove(at: index)
}
}
}
我在我的应用程序中使用协议,但为了简单起见,我在此处删除了它们。 任何帮助将不胜感激。
【问题讨论】:
-
你能展示你对
viewModel.deleteTask的实现吗? -
@NewDev 我已经更新了 Q。谢谢
-
根据您显示的内容,它应该可以工作。我怀疑这个错误介于
DataManager和您的ViewModel之间。 -
一般来说,您不希望在单步执行时从数组中删除
-
@NewDev 来自我所做的测试。仅当我从使用
ForEach(viewModel.tasks){ task in更改为上面显示的内容时,才会出现该错误。保持 dataManager 和 ViewModel 相同。
标签: swiftui