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

kiayqfof  于 2023-03-11  发布在  Swift
关注(0)|答案(7)|浏览(145)

我正在Xcode 11上构建一个SwiftUI应用程序,但每当我切换到应用程序中的某个特定选项卡时,它就会立即终止。
问题是,它总是指向Application Delegate文件,我认为这不是真正的问题。我也在控制台precondition failure: invalid input index: 2中得到这个错误,仅此而已,没有更多关于这个错误来自哪个文件、数组或函数的细节。

在Xcode中有什么方法可以隔离导致这个问题的原因吗?

x7yiwoj4

x7yiwoj41#

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

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

将列表视图 Package 在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")
        }
lyfkaqu1

lyfkaqu12#

我也碰到过这个。我只是想分享一下,以防有人觉得有用。

简短回答

将我的视图 Package 成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,前提条件失败将不会发生。
我在NavigationView上使用.navigationViewStyle(StackNavigationViewStyle()),这解决了我的问题。

3gtaxfhh

3gtaxfhh3#

我在模拟器上遇到过这个运行时错误。在我的例子中,问题是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
}
41zrol4v

41zrol4v4#

我认为Apple https://developer.apple.com/forums/thread/133958中存在一个与GeometryReader崩溃有关的错误,在我的案例中,我遇到了一个与tabBar类似的问题,并显示消息“前提条件失败:无效输入索引:当尝试将GeometryReader用作let w = geo.size.width时为2”
我试过在它周围使用守卫语句......不起作用--也许我不喜欢守卫。

vcirk6k6

vcirk6k65#

在我的例子中,我使用了一个已经在NavigationView中的TabView。在我的第4个选项卡中,我使用了一个命名空间动画,添加命名空间动画后,它崩溃了。我尝试从TabView中删除GeometryReader,它工作正常,但有其他后果。我在第4个选项卡中添加了额外的NavigationView,它也起作用了,但也有其他后果。但对我来说最合适的方法是移除一个**间隔物()**在第4个tav中。在我添加命名空间动画的视图中,按钮中有一个Spacer(),它将所有视图向上推,我删除了它,现在一切都很好。

gijlo24d

gijlo24d6#

有趣的是,我正在使用NavigationView,并将其更改为HSplitView,然后这个崩溃开始发生。我一回到NavigationView,这个问题就消失了。

lyfkaqu1

lyfkaqu17#

我也遇到了同样的问题,我只是从Identifiable中删除了随机ID(UUID),并修复了崩溃

相关问题