如何通过 NavigationLink 将 ForEach 数组索引传递到另一个 ForEach 而不会崩溃?
Posted
技术标签:
【中文标题】如何通过 NavigationLink 将 ForEach 数组索引传递到另一个 ForEach 而不会崩溃?【英文标题】:How do i pass the ForEach array index through a NavigationLink in to another ForEach without it crashing? 【发布时间】:2020-07-12 20:41:49 【问题描述】:我有一个奇怪的问题,如果我等待两秒钟并按下 NavigationLink,它会起作用,但如果我尝试在此之前按下它会使应用程序崩溃,我不确定我做错了什么。我要做的就是从第一个 ForEach 获取数组索引,以将其用于另一个 ForEach 循环。
在第一个结构中我已经声明了这些
@ObservedObject var vm = TripViewModel()
循环看起来像这样。我确保使用标签中的 print 和 Text 检查它实际上得到了数组索引,它确实做到了。
ForEach(vm.TripData.indices, id: \.self) trip in
NavigationLink(
destination: TripView(tripCount: trip),
label:
TableRow()
Text("\(trip)")
)
在第二个结构中,它声明了这些
@ObservedObject var vm = TripViewModel()
var tripCount: Int = 0
ForEach 依赖于之前的循环索引。
ForEach(vm.TripData[tripCount].Leg, id: \.self) day in
就在这里,我得到了崩溃错误“Thread 1: Fatal error: Index out of range”
【问题讨论】:
如何在TripViewModel
中声明TripData
TripData 是 ViewModel 中的 @Published 属性包装器。它将拉出我可解码的 json 中的第一个数组。 @Published var TripData = [TravelDetail]()
leg
int
的数组?
Leg 是一个字典数组。这是 JSON 的样子 pastebin.com/h4H0jLza
【参考方案1】:
最初 TripData
有一个 count = 0 并且您尝试访问它的第一个零索引元素,该元素当时不存在因此崩溃,您需要将其更改为
ForEach(vm.TripData.isEmpty ? [] : vm.TripData[tripCount].Leg, id: \.self) day in
【讨论】:
以上是关于如何通过 NavigationLink 将 ForEach 数组索引传递到另一个 ForEach 而不会崩溃?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 ContextMenu 与 NavigationLink 一起使用?
如何使用 SwiftUI 将上下文菜单添加到 NavigationLink?
如果它不可见,SwiftUI 如何使 NavigationLink 工作?