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
相关产品推荐
相关产品推荐

