繁体   English   中英

SwiftUI NavigationView在ForEach里面List里面用NavigationLink来回跳转

[英]SwiftUI NavigationView jumps back and forth with NavigationLink in ForEach inside List

我试图在 NavigationView 的列表的每一行中包含一个动态的导航链接列表。 但是,每当我点击其中一个链接时,导航都会来回跳转几次。

是什么导致来回导航? 是否可以使用 SwiftUI 以其他方式表达此模式以避免此问题?

import SwiftUI

struct MonthData: Hashable, Codable, Identifiable {
    var id: Int
    var name: String
    var tasks: [TaskData]
}

struct TaskData: Hashable, Codable, Identifiable {
    var id: Int
    var name: String
}

let months: [MonthData] = [
    MonthData(id: 1, name: "January", tasks: []),
    MonthData(id: 2, name: "February", tasks: [
        TaskData(id: 21, name: "Do something"),
        TaskData(id: 22, name: "Do something else")
    ])
]

struct FooView: View {
    var body: some View {
        NavigationView {
            List(months) { month in
                VStack {
                    ForEach(month.tasks) { task in
                         NavigationLink(
                            destination: Text(task.name)
                       ) {
                           Text(task.name)
                       }
                    }
                }
            }
            .navigationBarTitle(Text("Months"))
        }
    }
}

struct FooView_Previews: PreviewProvider {
    static var previews: some View {
        FooView()
    }
}

它来回移动,因为在您的 1 月示例中,单元格上没有链接,因为 1 月没有任务。 另一方面,二月份有两个导航链接(每个任务一个),这就是它进出的原因。 您需要首先考虑您的布局和导航。 但最终您需要为每个单元格添加一项,有些单元格可能会导航,有些可能不会,具体取决于您的逻辑。 但是每个列表项最多应该有一个导航链接。 这篇文章可能会有所帮助: SwiftUI - 嵌套列表

这是固定的变体。 使用 Xcode 12 / iOS 14 进行测试。

struct FooView: View {
    var body: some View {
        NavigationView {
            List {
                ForEach(months) { month in
                    Section {
                        ForEach(month.tasks) { task in
                            NavigationLink(
                                destination: Text(task.name)
                            ) {
                                Text(task.name)
                            }
                        }
                    }
                }
            }
            .navigationBarTitle(Text("Months"))
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM