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

SwiftUI中NavigationStack点击项后重复推入视图问题求助

问题原因与解决方案

问题根源

你的代码中将.navigationTitle和.navigationDestination修饰符附加在了ForEach上,这会导致循环里的每个列表项都重复注册了相同类型的导航目的地。点击列表项时,系统会匹配所有已注册的目的地,进而把数组中所有项一次性推入导航栈,最终出现多次点击返回才能回到根视图的问题。

修正步骤

  1. 调整导航修饰符位置:把.navigationTitle和.navigationDestination移到List外部,确保仅注册一次导航规则。
  2. 补充缺失的searchText状态变量(若需保留搜索功能)。
  3. 变量名遵循Swift小驼峰规范(可选但推荐)。

修正后的主视图代码

struct ContentView: View {
    @State private var biasStruct: BiasData = BiasData.allBias
    @State private var searchText = "" // 补充搜索文本状态

    var body: some View {
        VStack {
            NavigationStack {
                List {
                    ForEach(biasStruct.biases, id: \.self) { entry in
                        NavigationLink(value: entry) {
                            Text(entry.name)
                        }
                    }
                }
                .navigationTitle("Biases")
                .navigationDestination(for: Biase.self) { bias in
                    Text(bias.name)
                        .searchable(text: $searchText)
                }
                // 若要在根视图添加搜索框,将.searchable移到此处
            }
            .padding(8)
        }
    }
}

说明

修改后,导航目的地仅注册一次,点击列表项时只会将对应的单个Biase实例推入导航栈,返回时一次点击即可回到根视图。

内容的提问来源于stack exchange,提问作者John Citrowske

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 03:20:18