滚动列表时 SwiftUI 崩溃

Posted

技术标签:

【中文标题】滚动列表时 SwiftUI 崩溃【英文标题】:SwiftUI Crash when scrolling a list 【发布时间】:2019-11-29 00:01:19 【问题描述】:

很高兴在这里发布我的第一个问题!

我已经用 SwiftUI 玩了几个星期了,在一个更大的项目中,我发现了以下错误。

如果您有一个 TabView 和其中的列表,如果您在滚动动画发生时尝试更改选项卡,应用将崩溃并显示 FATAL ERROR: "Thread 1: signal SIGABRT"。

控制台

BugTest[11830:362796] 前置条件失败:属性设置初始值失败:98

你遇到过这种情况吗?有什么方法可以在不将列表更改为 ForEach 的情况下解决此问题?

提前谢谢你!

代码:

import SwiftUI

struct ContentView: View 
    var body: some View 
                TabView 
                    list()
                        .tabItem 
                            Image(systemName: "doc")
                                .font(.system(size: 25))
                    

                    Text("Testing the bug")
                        .tabItem 
                            Image(systemName: "list.dash")
                                .font(.system(size: 25))
                    
        
    


struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView()
    


struct list: View 

    var body: some View 
        List(0..<50)_ in
            Text("test")
        
    

【问题讨论】:

无法复制。 Xcode 11.2.1 (11B500) / ios 13.2.2。请尝试将您的列表包装在VStack 容器中,根据我的观察,在body 的顶层使用动态大小的视图(如ListScrollView)是错误的 我将列表嵌入到 VStack 中,但没有运气。我会坚持使用 ForEach,直到这个问题得到解决。谢谢你的回答! 您使用哪些 Xcode/iOS 版本?想知道。对于这种类型的系统级错误,最好注意使用哪种环境。谢谢。 我目前在 11.2.1 (11B500) @SimonBachmann 即使在 13.3 上我仍然遇到这个问题。请花点时间观看此视频 we.tl/t-GM5K90xJjG 【参考方案1】:

根据this post,出现错误是因为列表中的项目不符合Identifiable协议。

struct ContentView: View 
    var body: some View 
        TabView 
            list()
                .tabItem 
                    Image(systemName: "doc")
                        .font(.system(size: 25))
            

            Text("Testing the bug")
                .tabItem 
                    Image(systemName: "list.dash")
                        .font(.system(size: 25))
            
        
    


struct list: View 
    var elements: [CustomInt] = []

    init() 
        for i in 0...1000
            elements.append(CustomInt(text:String(i)))
        
    

    var body: some View 
        List(elements)element in
            Text(element.text)
        
    


struct CustomInt: Identifiable
    var id = UUID()
    var text:String


【讨论】:

【参考方案2】:

这应该可以工作

struct ContentView: View 
var body: some View 
            TabView 
               VStack
                list()
                    .tabItem 
                        Image(systemName: "doc")
                            .font(.system(size: 25))
                

                Text("Testing the bug")
                    .tabItem 
                        Image(systemName: "list.dash")
                            .font(.system(size: 25))
                
    



struct ContentView_Previews: PreviewProvider 
static var previews: some View 
    ContentView()


struct list: View 
var body: some View 
    List(0..<50)_ in
        Text("test")
    

【讨论】:

非常感谢!我稍微修改了你的版本,它适用于我的情况 您能解释一下区别吗?为什么这样有效?看起来你只是删除了他的代码来调用 list() 我明白了 - 你试图把它放在 VStack 中。对我来说没有帮助。替换为 ForEach 也无济于事。 不知道,但它在我的情况下很奇怪。 SwiftUI 有很多 List 的 bug。您可以尝试使用 Scroll View 吗?或者将代码发布在不适合您的地方。 我对代码进行了一些编辑,但您可以检查一下吗?看起来将所有选项卡放在 VStack 中并不是 OP 想要的。在这个版本中,我认为 TabView 根本不会显示标签。

以上是关于滚动列表时 SwiftUI 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

尝试删除最后一个元素时,带有子项的 SwiftUI (2.0) 列表崩溃

滚动视图中的内容作为列表项在滚动(swiftui)时消失,为啥?

滚动列表中的项目时丢弃 SwiftUI 状态

在 SwiftUI 中使用模态视图删除列表中的项目时崩溃

SwiftUI - 防止列表在项目选择时将滚动位置重置为顶部

当视图模型@Published 更改时,SwiftUI 列表因“NSRangeException”而崩溃