SwiftUI-StackNavigationStyle()导致前置条件失败:索引2无效

SwiftUI-StackNavigationStyle()导致前置条件失败:索引2无效,swiftui,ios13,Swiftui,Ios13,我有一个有4个主要视图的项目。下面是包含NavigationView的ContentView的主体。我添加了修改器.navigationViewStyle(StackNavigationViewStyle()),因此在横向模式下无法获得分割视图导航 ContentView.swift: var body: some View { NavigationView { VStack(alignment: .center, spacing: 10) {

我有一个有4个主要视图的项目。下面是包含NavigationView的ContentView的主体。我添加了修改器.navigationViewStyle(StackNavigationViewStyle()),因此在横向模式下无法获得分割视图导航

ContentView.swift:

var body: some View {
        NavigationView {
            VStack(alignment: .center, spacing: 10) {
                Text("Scoreboard")
                .font(.custom("Chalkduster", size: 50))
                
                Button(action: {
                    self.new_game = true
                }) {
                    Text("New Game")
                    .font(.custom("Chalkduster", size: 20))
                    .foregroundColor(.black)
                }
                
                NavigationLink(destination: CreateGameView(TEST_NAV: self.$new_game), isActive: $new_game) {
                    EmptyView()
                }
                //.isDetailLink(false)
            }
        }
        .navigationViewStyle(StackNavigationViewStyle())
    }
这导致我的应用程序在某些情况下崩溃,我不知道为什么。如果我删除此行,但将.isDetailLink(false)添加到每个导航链接(我在ContentView.swift、CreateGameView.swift和GameView.swift上有一个导航链接),也会导致此问题。我不知道如何用几个代码片段简洁地显示问题,因此我认为最好的方法是为整个项目提供重新创建崩溃的步骤。以下是该项目的github:

要重新创建崩溃:

  • 启动模拟器
  • 点击“新游戏”
  • 添加任何标题和至少一名球员
  • 开始比赛
  • 做两件事中的一件:
    • 长按“第1轮”标签以打开关联菜单(这将导致我认为是“无法同时满足约束”的警告。但我不认为这是一个问题)
    • 单击并将“第一轮”标签向上或向下拖动
  • 向后导航,应用程序将因“前提条件失败:无效索引2”而崩溃。在GameView.swift的第65行出现了一个SIGABRT
  • 据我所知:

    我想这和GeometryReader有关。我唯一使用GeometryReader的地方是:

    GameView.swift第29行:

    struct TrackableScrollView<Content>: View where Content: View {
        let axes: Axis.Set
        let showIndicators: Bool
        @Binding var contentOffset: CGFloat
        let content: Content
        
        init(_ axes: Axis.Set = .vertical, showIndicators: Bool = true, contentOffset: Binding<CGFloat>, @ViewBuilder content: () -> Content) {
            self.axes = axes
            self.showIndicators = showIndicators
            self._contentOffset = contentOffset
            self.content = content()
        }
        
        var body: some View {
            GeometryReader { outsideProxy in
                ScrollView(self.axes, showsIndicators: self.showIndicators) {
                    ZStack(alignment: self.axes == .vertical ? .top : .leading) {
                        GeometryReader { insideProxy in
                            Color.clear
                                .preference(key: ScrollOffsetPreferenceKey.self, value: [self.calculateContentOffset(fromOutsideProxy: outsideProxy, insideProxy: insideProxy)])
                                // Send value to the parent
                        }
                        VStack {
                            self.content
                        }
                    }
                }
                .onPreferenceChange(ScrollOffsetPreferenceKey.self) { value in
                    self.contentOffset = value[0]
                }
                // Get the value then assign to offset binding
            }
        }
        
        private func calculateContentOffset(fromOutsideProxy outsideProxy: GeometryProxy, insideProxy: GeometryProxy) -> CGFloat {
            if axes == .vertical {
                return (insideProxy.frame(in: .global).minY - outsideProxy.frame(in: .global).minY)
            } else {
                return (insideProxy.frame(in: .global).minX - outsideProxy.frame(in: .global).minX)
            }
        }
    }
    
    struct TrackableScrollView:View其中Content:View{
    让轴:轴。设定
    让我们看看:布尔
    @绑定变量contentOffset:CGFloat
    让内容:内容
    init(uAxes:Axis.Set=.vertical,showIndicators:Bool=true,contentOffset:Binding,@ViewBuilder content:()->content){
    self.axes=轴
    self.showIndicators=showIndicators
    self.\u contentOffset=contentOffset
    self.content=content()
    }
    var body:一些观点{
    GeometryReader{outsideProxy in
    滚动视图(self.axes、showsIndicators:self.showsIndicators){
    ZStack(对齐:self.axes==.vertical?.top:.leading){
    GeometryReader{insideProxy in
    颜色。清晰
    .preference(键:ScrollOffsetPreferenceKey.self,值:[self.calculateContentOffset(fromOutsideProxy:outsideProxy,insideProxy:insideProxy)])
    //将值发送给父级
    }
    VStack{
    自满
    }
    }
    }
    .onPreferenceChange(ScrollOffsetPreferenceKey.self){中的值
    self.contentOffset=值[0]
    }
    //获取值,然后分配给偏移绑定
    }
    }
    private func calculateContentOffset(从Outside Proxy Outside Proxy:GeometryProxy,insideProxy:GeometryProxy)->CGFloat{
    如果轴==。垂直{
    return(insideProxy.frame(in:.global).minY-outsideProxy.frame(in:.global.minY)
    }否则{
    return(insideProxy.frame(in:.global).minX-outsideProxy.frame(in:.global.minX)
    }
    }
    }
    
    上面是在此处创建的可跟踪滚动视图:

    它允许我从垂直和水平滚动视图获得滚动偏移,并匹配主栅格的移动

    现在注释掉ContentView.swift(如上所示)中的.navigationViewStyle(StackNavigationViewStyle())。重复这些步骤,不应发生碰撞。这是我发现的唯一可以修复崩溃的东西

    有人知道为什么会这样吗?有没有办法在不删除的情况下修复此崩溃。navigationViewStyle(StackNavigationViewStyle())