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

SwiftUI中如何在ForEach循环内使用视图数组更新NavigationLink下标

问题原因

你遇到的核心问题有两个:

  • 原代码中ForEach(filteredItems)遍历返回的是item类型的实例,不是数组下标,所以你直接尝试用返回值当下标会报类型不匹配错误
  • 你定义的局部变量i是body内部的临时变量,SwiftUI每次重绘body时i都会被重置为0,且onAppear的触发时机和列表渲染顺序不保证一致,所以所有NavigationLink的目标都取到了初始值i=0,全跳转到第一个视图。
修复方案

直接修改Home结构体的body内的列表遍历逻辑,同时获取元素下标和对应数据即可:

struct Home: View {
    
    let views : [AnyView] = [ AnyView(untitled_Skull()), AnyView(dogs()), AnyView(cats()) ]

    @Binding var filteredItems : [item]
    
    var body: some View {
        ScrollView(.vertical, showsIndicators: false) {
            VStack(spacing: 15){
                // 同时遍历下标和元素,用element的id作为唯一标识
                ForEach(Array(filteredItems.enumerated()), id: \.element.id) { index, item in
                    NavigationLink(destination: views[index]) {
                        itemView(item: item)
                    }
                }
            }
            .padding()
        }
    }
}
// 其余原有代码不需要改动
优化建议

如果后续需要支持搜索过滤后仍然稳定跳转,避免因为数组顺序变化导致索引和视图不匹配,可以给item结构体新增一个唯一标识字段绑定目标视图,比依赖下标匹配的可靠性更高。

内容的提问来源于stack exchange,提问作者WIlliam Wang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:36:02