ForEach 循环中的 SwiftUI 崩溃

Posted

技术标签:

【中文标题】ForEach 循环中的 SwiftUI 崩溃【英文标题】:SwiftUI Crash in ForEach Loop 【发布时间】:2021-04-07 03:37:03 【问题描述】:
 ScrollView(.horizontal, showsIndicators: false, content: 
        LazyHGrid(rows: gridLayout2, alignment: .center, spacing: columnSpacing, pinnedViews: [], content: 
            Section(
                header: SectionView(rotateClockwise: false, headerText: "Premium Store"),
                footer: SectionView(rotateClockwise: true, headerText: "Premium Store")) 
                ForEach(premiumStoreItems)  item in
                    StoreItemView(storeItem: item)
                
            
        ) //: LAZYHGRID
        .frame(height: 200)
        .padding(15)
    )

崩溃发生在 ForEach 循环中。

如果我评论 ForEach 并从我的数组中传入 1 个特定项目,它工作正常。但是我需要在我的数组中显示我的所有项目。

我不知道在这里做什么。

以下代码可以正常工作。

 //ForEach(premiumStoreItems)  item in
      StoreItemView(storeItem: premiumStoreItems[0])
 //

崩溃日志(对不起,我不知道从哪里得到它)

Application Specific Information:
Fatal error: each layout item may only occur once: file SwiftUI, line 0

------完整的崩溃日志

进程:AppExample001 [3525] 路径:/Users/USER/Library/Developer/Xcode/UserData/Previews/Simulator Devices/C93C2BE8-C23A-4813-9D6C-110E87786FFE/data/Containers/Bundle/Application/40562FF7-7B66-4BE4-915A-5A2A35AD3EC2/AppExample001。应用程序/AppExample001 标识符:AppExample001 版本:1.0 (1) 代码类型:X86-64(本机) 父进程:launchd_sim [2488] 责任人:模拟器蹦床[611] 用户 ID:501

日期/时间:2021-04-07 12:23:50.173 -0400 操作系统版本:macOS 11.2.3 (20D91) 报告版本:12 桥操作系统版本:5.2 (18P4347) 匿名 UUID:5A68DF80-DD1B-1132-4597-BBC26C334627

自启动后的唤醒时间:7000 秒

系统完整性保护:启用

崩溃的线程:0 调度队列:com.apple.main-thread

异常类型:EXC_BAD_INSTRUCTION (SIGILL) 异常代码:0x0000000000000001、0x0000000000000000 异常说明:EXC_CORPSE_NOTIFY

终止信号:非法指令:4 终止原因:命名空间信号,代码 0x4 终止进程:exc 处理程序 [3525]

ID Vend/Dev 95f5 687f1002 秒前 ID 类型 6900.0 95f5 附加

应用特定信息: 致命错误:每个布局项只能出现一次:文件 SwiftUI,第 0 行

CoreSimulator 732.18.6 - 设备:iPhone SE(第 2 代)(C93C2BE8-C23A-4813-9D6C-110E87786FFE) - 运行时:ios 14.4 (18D46) - 设备类型:iPhone SE(第 2 代)

线程 0 崩溃::调度队列:com.apple.main-thread 0 libswiftCore.dylib 0x00007fff2fc85004 assertionFailure(::file:line:flags:) + 532 1 com.apple.SwiftUI 0x00007fff572e9d24 ViewCache.commitPlacedChildren(从:到:)+ 4020 2 com.apple.SwiftUI 0x00007fff571a1f16 专用 IncrementalChildPlacements.updateValue() + 1558 3 com.apple.SwiftUI 0x00007fff572be37f 部分适用于 Attribute.init(:) + 15 中的隐式闭包#1 中的闭包#1 中的闭包#1 中的专用隐式闭包#2 4 com.apple.AttributeGraph 0x00007fff4cd78723 AG::Graph::UpdateStack::update() + 505 5 com.apple.AttributeGraph 0x00007fff4cd78bb9 AG::Graph::update_attribute(AG::data::ptr<:node>, bool) + 335 6 com.apple.AttributeGraph 0x00007fff4cd7d85f AG::Graph::input_value_ref_slow(AG::data::ptr<:node>, AG::AttributeID, unsigned int, AGSwiftMetadata const*, bool*, long) + 523 7 com.apple.AttributeGraph 0x00007fff4cd8edc5 AGGraphGetValue + 203 8 com.apple.SwiftUI 0x00007fff572edac0 IncrementalPreference.children.getter + 48 9 com.apple.SwiftUI 0x00007fff572edb95 IncrementalPreference.value.getter + 85 10 com.apple.SwiftUI 0x00007fff572ede1c Rule.value.getter 的协议见证符合 IncrementalPreference + 28 11 com.apple.AttributeGraph 0x00007fff4cd91907 调度 Rule.value.getter + 7 12 com.apple.SwiftUI 0x00007fff570e9a18 隐式闭包#2 隐式闭包#1 闭包#1 闭包#1 in Attribute.init(_:) + 56 13 com.apple.AttributeGraph 0x00007fff4cd78723 AG::Graph::UpdateStack::update() + 505 14 com.apple.AttributeGraph 0x00007fff4cd78bb9 AG::Graph::update_attribute(AG::data::ptr<:node>, bool) + 335 15 com.apple.AttributeGraph 0x00007fff4cd7d318 AG::Graph::value_ref(AG::AttributeID, AGSwiftMetadata const*, bool*) + 130 16 com.apple.AttributeGraph 0x00007fff4cd8ee13 AGGraphGetValue + 281 17 com.apple.SwiftUI 0x00007fff57987807 GraphHost.updatePreferences() + 39 18 com.apple.SwiftUI 0x00007fff57458cbf ViewGraph.updateOutputs(at:) + 95 19 com.apple.SwiftUI 0x00007fff573f04e4 ViewRendererHost.render(interval:updateDisplayList:) + 1316 中的特殊闭包 #1 20 com.apple.SwiftUI 0x00007fff573ed28e 专用 ViewRendererHost.render(interval:updateDisplayList:) + 366 21 com.apple.SwiftUI 0x00007fff57a59c0e 专用 UI​​HostingController._render(秒:) + 46 22 com.apple.dt.XCPreviewKit 0x000000010c117536 0x10c10a000 + 54582 23 com.apple.dt.XCPreviewKit 0x000000010c1246eb 0x10c10a000 + 108267 24 com.apple.dt.XCPreviewKit 0x000000010c11b91f 0x10c10a000 + 71967 25 com.apple.dt.XCPreviewKit 0x000000010c11bc08 0x10c10a000 + 72712 26 com.apple.dt.XCPreviewKit 0x000000010c11ddff 0x10c10a000 + 81407 27 com.apple.dt.XCPreviewKit 0x000000010c11c274 0x10c10a000 + 74356 28 com.apple.dt.XCPreviewKit 0x000000010c1134e3 0x10c10a000 + 38115 29 com.apple.dt.XCPreviewKit 0x000000010c112eee 0x10c10a000 + 36590 30 libdispatch.dylib 0x00007fff2010532f _dispatch_call_block_and_release + 12 31 libdispatch.dylib 0x00007fff20106508 _dispatch_client_callout + 8 32 libdispatch.dylib 0x00007fff20112ff7 dispatch_main_queue_callback_4CF + 1045 33 com.apple.CoreFoundation 0x00007fff2038fdbb CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE + 9 34 com.apple.CoreFoundation 0x00007fff2038a63e __CFRunLoopRun + 2685 35 com.apple.CoreFoundation 0x00007fff203896d6 CFRunLoopRunSpecific + 567 36 com.apple.GraphicsServices 0x00007fff2c257db3 GSEventRunModal + 139 37 com.apple.UIKitCore 0x00007fff24696cf7 -[UIApplication 运行] + 912 38 com.apple.UIKitCore 0x00007fff2469bba8 UIApplicationMain + 101 39 com.apple.SwiftUI 0x00007fff5791abc7 闭包 #1 在 KitRendererCommon(:) + 119 40 com.apple.SwiftUI 0x00007fff5791ab3f runApp(:) + 143 41 com.apple.SwiftUI 0x00007fff5745212d 静态 App.main() + 61 42 com.oneorangetree.AppExample001 0x000000010bfcaf4e 静态 AppExample001App.$main() + 78 43 com.oneorangetree.AppExample001 0x000000010bfcafd4 主 + 20 44 libdyld.dylib 0x00007fff2025a3e9 开始 + 1

【问题讨论】:

崩溃发生时错误说明了什么? 添加了崩溃日志@Cuneyt 【参考方案1】:

ForEach 无法唯一标识每个项目, 确保您的数据模型结构已确认可识别协议

试试这个

ForEach(premiumStoreItems, id:\.self)
ForEach(premiumStoreItems, id:\.id) // if you've unique identifier with the name of "id"

【讨论】:

以上是关于ForEach 循环中的 SwiftUI 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

在 ForEach 循环中绑定时,如何阻止 SwiftUI TextField 失去焦点?

ForEach 中的 SwiftUI 索引超出范围

从 SwiftUI 中的列表中删除绑定

SwiftUI - ForEach 循环中的弹出框

为啥我不能访问这个数组 ForEach 循环中的数据? SwiftUI

SwiftUI Picker 填充问题 - 选择器中的 ForEach 循环不填充