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

gre*_*rey 22 debugging xcode swift swiftui

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

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

在此处输入图片说明

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

bee*_*ore 22

我有一个包含使用列表的视图的 TabView。切换选项卡时,我的应用程序因类似错误而崩溃:“前提条件失败:属性未能设置初始值:99”这崩溃了:

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

将 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")
        }
Run Code Online (Sandbox Code Playgroud)

  • 这可行,但并不理想。我不需要导航视图。 (2认同)

Fer*_*ndo 10

我也遇到过这种情况。我只是想分享它,以防有人觉得它有用。

简答

将我的视图包装成 aNavigationView会引发错误。使用.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")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我曾经.navigationViewStyle(StackNavigationViewStyle())NavigationView和解决了我的问题。


FRI*_*DAY 5

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

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

我移动了NavigationBarItems修改器并将其交给ScrollView

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