如何在Xcode中调试“前提条件失败”?

时间:2019-10-09 12:19:56

标签: swift xcode debugging swiftui

我正在Xcode 11上构建一个SwiftUI应用程序,但是当我切换到该应用程序中的特定选项卡时,它将立即终止。

事实是,它始终指向Application Delegate文件,我认为这并不是真正的问题。我也在控制台precondition failure: invalid input index: 2中收到此错误,仅此而已,没有更多有关此错误来自哪个文件,数组或函数的更多详细信息。

enter image description here

Xcode中是否有任何方法可以隔离导致此问题的原因?

7 个答案:

答案 0 :(得分:7)

我也遇到了这个问题。我只想分享它,以防有人发现它有用。

缩短答案

将视图换成NavigationView会引发错误。使用.navigationViewStyle(StackNavigationViewStyle())解决了我的问题。

长答案

我有这样的东西:

NavigationView {
    GeometryReader { proxy in
        VStack {
            Text("Dummy")
            Spacer()            
            MyView()    // CONTAINS HAS A GEOMETRY READER TOO
                .frame(width: min(proxy.size.width, proxy.size.height),
                       height: min(proxy.size.width, proxy.size.height)) 
            Spacer()
            Text("Dummy")
        }
    }
}

然后,MyView的内部也有GeometryReader。所描述的代码将失败。如果NavigationView被删除,则前提条件失败不会发生。

我在.navigationViewStyle(StackNavigationViewStyle())上使用了NavigationView,这解决了我的问题。

答案 1 :(得分:1)

我有一个TabView,其中包含使用列表的视图。 切换标签时,我的应用崩溃时出现类似错误: “前提条件失败:属性无法设置初始值:99” 这崩溃了:

var body: some View {
    TabView {
        ListView()
        .tabItem {
            Image(systemName: "list.dash")
            Text("List")
        }

将ListView包裹在NavigationView中修复了崩溃。 我在Caleb Wells的“ Swift Live – 007 SwiftUI TabView && List”上看到了NavigationView的这种用法。 https://youtu.be/v1A1H1cQowI

https://github.com/calebrwells/A-Swiftly-Tilting-Planet/tree/master/2019/Live%20Streams/TabView%20List

这有效:

var body: some View {
    TabView {
        NavigationView { ListView() }
        .tabItem {
            Image(systemName: "list.dash")
            Text("List")
        }

答案 2 :(得分:0)

我在模拟器上遇到此运行时错误。就我而言,问题是NavigationBarItems,我在错误的块中使用了它,如下所示:

NavigationView {
    Group {
        if something {
            
            ScrollView {
                ...
            }//ScrollView
            
        } else {
            ...
        }
        
    }//group
        .navigationBarItems(trailing: self.favoriteItem) // CRASH**
}

我移动了NavigationBarItems修饰符,并将其赋予了ScrollView

NavigationView {
        Group {
            if something {
            
            ScrollView {
                ...
            }//ScrollView
            .navigationBarItems(trailing: self.favoriteItem) // NO CRASH**
            
        } else {
            ...
        }
        
    }//group
}

答案 3 :(得分:0)

我认为Apple已提交了一个错误 https://developer.apple.com/forums/thread/133958 与GeometryReader崩溃有关的问题 在我的情况下,当尝试将GeometryReader用作以下命令时,我会遇到与tabBar类似的问题和消息“前提条件失败:输入索引无效:2” let w = geo.size.width

我已经尝试过在其周围使用一个保护声明...没有用-也许我不理解GUARD。

答案 4 :(得分:0)

在我的情况下,我使用了一个已经位于NavigationView内部的TabView。在我的第四个标签中,我使用了一个命名空间进行动画处理,并在添加了命名空间动画后崩溃了。我尝试从TabView中删除GeometryReader,它虽然有效,但还有其他后果。我在第4个选项卡中添加了额外的NavigationView,它也可以工作,但也有其他后果。但是,最适合我的方法是在第4个tav中删除 Spacer()。在添加了命名空间动画的View内,按钮上有一个Spacer()可以将所有视图向上推,然后我将其删除,一切都很好。

答案 5 :(得分:0)

有趣的是,我正在使用 NavigationView 并将其更改为 HSplitView,并且此崩溃开始发生。一旦我回到 NavigationView,它就消失了。

答案 6 :(得分:-2)

您需要为Swift错误添加一个断点。

在断点导航器中,按左下方的 + ,然后选择 Swift错误断点

enter image description here

您的应用现在将在实际故障点中断。