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

如何在SwiftUI中为ForEach传递参数实现页面跳转?

SwiftUI三级图书页面跳转参数传递问题

我在SwiftUI中开发三级图书页面,分别为:

  • TopGroup.swift(一级页面,展示图书主分类)
  • SubGroup.swift(二级页面,展示图书子分类)
  • Detail.swift(三级页面,展示图书详情)

目前已实现SubGroup与Detail的跳转,但TopGroup无法跳转至对应SubGroup,不清楚如何通过下标等方式传递参数。

数据模型定义

struct Top: Identifiable {
    let id = UUID()
    let name: String
    let group: [Group]
    subscript(_ groupIndex: Int) -> Group {
        return group[groupIndex]
    }
}

struct Group: Identifiable {
    let id = UUID()  
    let name: String 
    let books: [Book]  // 存储单本图书的详情信息
}

当前代码

TopGroup.swift

struct TopGroup: View {
    var body: some View {
        NavigationView {
            List {
                // 展示主分类名称
                ForEach(top) { item in
                    NavigationLink {
                        SubGroup()  // 此处需要跳转到对应子分类页面
                    } label: {
                        VStack {
                            Text(item.name)
                        }
                    }
                }
            }
        }
    }
}

SubGroup.swift

struct SubGroup: View {    
    var body: some View {
        NavigationView {
            List {
            
            // 此处应展示对应主分类下的子分类,比如group[0], group[1], group[2]...
                ForEach(group[0]) { item in
                    Section(header: Text("Books Category of \(item.name)")) {
                        
                        // 跳转到图书详情页
                        ForEach(item.books) { bookItem in
                            NavigationLink {
                                Detail(book: bookItem)
                            } label: {
                                BookRow(book: bookItem)
                            }
                        }
                    }
                }
            }
            .navigationBarTitle(top[0].name, displayMode: .inline)
        }
    }
}

困惑点

  • 如何将TopGroup的参数传递给SubGroup,使每个主分类项跳转至对应子分类页面;
  • 无需创建多个如SubGroup0.swift的视图文件,即可展示不同子分类的视图内容。

解决方案

1. 给SubGroup添加接收参数的属性

修改SubGroup.swift,新增属性接收主分类数据,同时移除内层NavigationView避免导航栏异常:

struct SubGroup: View {
    // 接收从TopGroup传递的当前主分类实例
    let currentTop: Top
    
    var body: some View {
        List {
            // 遍历当前主分类下的所有子分类
            ForEach(currentTop.group) { subGroup in
                Section(header: Text("Books Category of \(subGroup.name)")) {
                    ForEach(subGroup.books) { bookItem in
                        NavigationLink {
                            Detail(book: bookItem)
                        } label: {
                            BookRow(book: bookItem)
                        }
                    }
                }
            }
        }
        .navigationBarTitle(currentTop.name, displayMode: .inline)
    }
}

2. 在TopGroup中传递参数到SubGroup

修改TopGroup.swift的NavigationLink,将当前遍历到的主分类实例传入SubGroup:

struct TopGroup: View {
    // 假设此处是你的主分类数据源
    // let top: [Top] = [...]
    
    var body: some View {
        NavigationView {
            List {
                ForEach(top) { item in
                    NavigationLink {
                        // 传递当前主分类数据到对应子分类页面
                        SubGroup(currentTop: item)
                    } label: {
                        VStack {
                            Text(item.name)
                        }
                    }
                }
            }
        }
    }
}

关键说明

  • 通过给SubGroup添加currentTop属性,每个主分类项跳转时都会传递对应的Top实例,SubGroup直接遍历该实例的group数组即可展示对应子分类,无需创建多个视图文件。
  • 移除SubGroup内的NavigationView,SwiftUI只需要外层一个NavigationView作为导航容器,后续页面通过NavigationLink跳转即可,避免双层导航栏问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:40:36