我想要一个任务列表,每个任务都有一个导航链接列表,每个导航链接都有 subtaskName 作为标签,subtaskDetails 作为目的地,每个列表(任务列表和子任务列表)都有 .onDelete 和 .onMove 行为
但是当我实现导航链接下面的代码时,行为很奇怪。单击内部
navigationLink
内的 List
不会导航,仅在单击外部 List
行时才会触发并导航到 SubtaskDetailView
。我该如何解决这个问题?List
import SwiftUI
struct ContentView: View {
@State private var tasks: [Task] = [
Task(name: "Task 1", subtasks: [
Subtask(name: "Subtask 1", details: "Details for Subtask 1"),
Subtask(name: "Subtask 2", details: "Details for Subtask 2")
]),
Task(name: "Task 2", subtasks: [
Subtask(name: "Subtask 1", details: "Details for Subtask 1"),
Subtask(name: "Subtask 2", details: "Details for Subtask 2")
]),
Task(name: "Task 3", subtasks: [
Subtask(name: "Subtask 1", details: "Details for Subtask 1"),
Subtask(name: "Subtask 2", details: "Details for Subtask 2")
])
]
var body: some View {
NavigationView {
List {
ForEach(tasks.indices, id: \.self) { index in
TaskView(task: $tasks[index])
}
.onDelete(perform: deleteTask)
.onMove(perform: moveTask)
}
.navigationTitle("Tasks")
.toolbar {
EditButton()
}
}
}
private func deleteTask(at offsets: IndexSet) {
tasks.remove(atOffsets: offsets)
}
private func moveTask(from source: IndexSet, to destination: Int) {
tasks.move(fromOffsets: source, toOffset: destination)
}
}
struct TaskView: View {
@Binding var task: Task
var body: some View {
List {
Text(task.name)
.font(.headline)
.padding(.bottom, 4)
ForEach(task.subtasks.indices, id: \.self) { index in
NavigationLink(destination: SubtaskDetailView(details: task.subtasks[index].details)) {
Text(task.subtasks[index].name)
}
}
.onDelete(perform: { indexSet in
task.subtasks.remove(atOffsets: indexSet)
})
.onMove(perform: { indices, newOffset in
task.subtasks.move(fromOffsets: indices, toOffset: newOffset)
})
}
.frame(minHeight: CGFloat(task.subtasks.count) * 80)
}
}
struct SubtaskDetailView: View {
let details: String
var body: some View {
Text(details)
.navigationTitle("Subtask Details")
}
}
struct Task: Identifiable {
let id = UUID()
var name: String
var subtasks: [Subtask]
}
struct Subtask: Identifiable {
let id = UUID()
var name: String
var details: String
}
不是一个 for 循环,你不应该将它与索引一起使用,如果数据发生变化,它会在尝试 array[x] 下标时崩溃,请像这样使用它:
ForEach
ForEach($tasks) { $task in
TaskView(task: $task)
}
有很多问题,因此最好使用新的
NavigationView
(和 NavigationStack
/.navigationDestination
)或 NavigationPath
。