如何通过 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?

如何以编程方式触发 NavigationLink?

如果它不可见,SwiftUI 如何使 NavigationLink 工作?

NavigationLink 不断将我的文本元素对齐到中心而不是领先 SwiftUI

如何在 SwiftUI 中使用可观察对象并与 NavigationLink 绑定?