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

SwiftUI中如何在详情页获取NavigationView内Rosette的指定数据

解决方案:在SwiftUI详情页访问UserProfileResponse中的Rosette数据

首先确保导航到详情页时,已将UserProfileResponse实例正确传递过去,以下是完整实现步骤:

1. 导航传递数据

在触发导航的页面(比如列表页),通过NavigationLink将UserProfileResponse实例传递给详情页:

struct ProfileListPage: View {
    // 示例初始化UserProfileResponse实例
    let userProfile = UserProfileResponse(
        userName: "testUser",
        level: 5,
        photo: "",
        followerCount: 100,
        followCount: 80,
        name: "Test Name",
        title: "Athlete",
        bio: "Hello World",
        height: 180,
        weight: 75,
        dateOfBirth: 1000000000,
        rosette: CircleLevelList.four,
        activities: [],
        docId: "123"
    )
    
    var body: some View {
        NavigationStack { // iOS16+用NavigationStack,旧版本替换为NavigationView
            NavigationLink(destination: ProfileDetailPage(userProfile: userProfile)) {
                Text("进入个人详情页")
            }
        }
    }
}

2. 详情页接收并访问Rosette数据

详情页接收UserProfileResponse参数后,可根据需求访问rosette数组中的数据:

场景1:访问单个Rosette的字段

如果需要获取数组中特定位置的Rosette(比如第一个),用可选绑定避免空数组崩溃:

struct ProfileDetailPage: View {
    let userProfile: UserProfileResponse
    
    var body: some View {
        VStack(spacing: 20) {
            Text("用户名:\(userProfile.userName)")
            
            if let firstRosette = userProfile.rosette.first {
                Text("首个徽章等级:\(firstRosette.rosetteLevel)")
                Text("已完成进度:\(firstRosette.rosetteDone)")
            }
        }
        .navigationTitle("个人详情")
    }
}

场景2:遍历所有Rosette展示数据

要展示全部徽章信息,用ForEach遍历数组:

struct ProfileDetailPage: View {
    let userProfile: UserProfileResponse
    
    var body: some View {
        List {
            Section(header: Text("个人基础信息")) {
                Text("用户名:\(userProfile.userName)")
                Text("当前等级:\(userProfile.level)")
            }
            
            Section(header: Text("徽章列表")) {
                ForEach(userProfile.rosette, id: \.sıra) { rosette in
                    VStack(alignment: .leading, spacing: 4) {
                        Text("徽章名称:\(rosette.rosetteName)")
                        Text("徽章等级:\(rosette.rosetteLevel)")
                        Text("已完成次数:\(rosette.rosetteDone)")
                        Text("完成率:\(String(format: "%.0f%%", rosette.percentageComplete * 100))")
                    }
                }
            }
        }
        .navigationTitle("个人详情")
    }
}

关键注意点

  • rosette是数组类型,访问单个元素时必须做空值判断,避免数组为空导致崩溃
  • 遍历数组时,需给ForEach提供唯一标识符,这里用rosette.sıra(确保sıra字段值唯一)
  • 如果UserProfileResponse是从网络/本地解析而来,要确保rosette数组已正确初始化,若为可选类型需先解包

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:45:30