SwiftUI:NavigationSplitView混合条件行与分组时崩溃求助
已向苹果提交该Bug(编号FB12119791),确认并非代码逻辑问题,现发布内容存档并寻求社区解决方案。
问题场景
在NavigationSplitView的侧边栏列表中,同时渲染分组内的可导航行与分组外的条件渲染非导航行时,可稳定复现崩溃。
复现步骤
- 创建包含NavigationSplitView的SwiftUI视图,侧边栏列表包含带
tag的可导航元素,以及由布尔状态控制的条件渲染非导航元素; - 进入某可导航元素的详情页后返回列表;
- 关闭条件状态以隐藏条件渲染元素;
- 再次尝试点击可导航元素进入详情页。
预期结果
导航视图正常跳转到选中元素的详情页
实际结果
应用(或Xcode预览)在@main入口处直接崩溃
代码示例
import SwiftUI fileprivate struct Item: Identifiable, Hashable { let id = UUID() } fileprivate let items = (0...10).map { _ in Item() } struct ListSelectionConditionalViewCrashExample: View { @State var showConditionalView = true @State var selectedItem: UUID? var body: some View { NavigationSplitView { List(selection: $selectedItem) { Section { Label("点击下方可导航行区域的某一行", systemImage: "1.circle") Label("返回当前列表页", systemImage: "2.circle") Label("关闭下方的开关", systemImage: "3.circle") Label("再次点击可导航行区域的某一行", systemImage: "4.circle") Label("观察应用崩溃", systemImage: "exclamationmark.circle") .foregroundStyle(.red) Text("注意:仅当可导航行与非导航行处于不同分组时才会触发此问题") Toggle(isOn: $showConditionalView.animation()) { Text("渲染条件视图") } } header: { Text("操作步骤") } if showConditionalView { Text("条件视图") } Section { ForEach(items) { item in Text(item.id.uuidString) .tag(item.id) } } header: { Text("可导航行") } } .navigationTitle("导航列表崩溃示例") } detail: { if let selectedItem, let item = items.first(where: { $0.id == selectedItem }) { Text(item.id.uuidString) .navigationTitle("详情页") } else { Text("未选择任何内容") } } } } struct ListSelectionConditionalViewCrashExample_Previews: PreviewProvider { static var previews: some View { ListSelectionConditionalViewCrashExample() } }
内容的提问来源于stack exchange,提问作者Dan Eden
相关产品推荐
相关产品推荐

