嵌套列表内的NavigationLink仅在单击时触发外部列表行并且无法正确导航

问题描述 投票:0回答:1

我想要一个任务列表,每个任务都有一个导航链接列表,每个导航链接都有 subtaskName 作为标签,subtaskDetails 作为目的地,每个列表(任务列表和子任务列表)都有 .onDelete 和 .onMove 行为

但是当我实现导航链接下面的代码时,行为很奇怪。单击内部

navigationLink
内的
List
不会导航,仅在单击外部
List
行时才会触发并导航到
SubtaskDetailView
。我该如何解决这个问题?
List


swift list swiftui swiftui-navigationlink
1个回答
0
投票
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
    

© www.soinside.com 2019 - 2024. All rights reserved.