滚动列表时 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
的顶层使用动态大小的视图(如List
,ScrollView
)是错误的
我将列表嵌入到 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)时消失,为啥?