【问题标题】:SwiftUI Crash when scrolling a list滚动列表时 SwiftUI 崩溃
【发布时间】: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

标签: list scroll swiftui tabview


【解决方案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 根本不会显示标签。
    猜你喜欢
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    相关资源
    最近更新 更多