You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:45:02