SwiftUI-StackNavigationStyle()导致前置条件失败:索引2无效
我有一个有4个主要视图的项目。下面是包含NavigationView的ContentView的主体。我添加了修改器.navigationViewStyle(StackNavigationViewStyle()),因此在横向模式下无法获得分割视图导航 ContentView.swift:SwiftUI-StackNavigationStyle()导致前置条件失败:索引2无效,swiftui,ios13,Swiftui,Ios13,我有一个有4个主要视图的项目。下面是包含NavigationView的ContentView的主体。我添加了修改器.navigationViewStyle(StackNavigationViewStyle()),因此在横向模式下无法获得分割视图导航 ContentView.swift: var body: some View { NavigationView { VStack(alignment: .center, spacing: 10) {
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轮”标签以打开关联菜单(这将导致我认为是“无法同时满足约束”的警告。但我不认为这是一个问题)
- 单击并将“第一轮”标签向上或向下拖动
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())