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

SwiftUI中实现嵌套列表展示服务器返回的OptionsListByItemId数据

如何在SwiftUI中实现嵌套列表展示选项与对应选择项

你现在的问题是SwiftUI视图只展示了选项名称(Temperature、Humidity),但没有显示每个选项下对应的选择项,其实只需要在List里嵌套一个ForEach来遍历每个选项的Choices数组就可以解决,下面是具体的修改步骤和代码:

1. 修正视图中的列表结构

把你当前的Optionspage视图的body部分修改成下面这样,在每个选项名称的Text下方,添加一个ForEach来遍历该选项对应的所有选择项:

struct Optionspage: View {
    @ObservedObject var choicevwModel: ItemChoiceViewModel // 建议把ViewModel作为参数传入,避免在视图内部初始化
    
    var body: some View {
        List(choicevwModel.OpnChoice.OptionsListByItemId) { opn in
            // 显示当前选项的名称
            Text(opn.OptionName ?? "Unknown Option") // 建议处理可选值,避免隐式解包崩溃
            
            // 遍历当前选项下的所有选择项
            ForEach(opn.Choices, id: \.ChoiceId) { choice in
                Text(choice.ChoiceName ?? "Unknown Choice")
                    .padding(.leading, 20) // 添加缩进让层级关系更清晰
            }
        }
    }
}

2. 修正视图中的ViewModel初始化问题

你当前的ItemView里有两个小问题需要调整:

  • 定义了冗余的var OpnChoice = OptionsandChoiceList(...),这个变量并没有被使用,可以直接删除;
  • ViewModel的类名是ItemChoiceViewModel,但你初始化的时候写的是ChoiceViewModel(),这会导致编译错误,要改成正确的类名。

修改后的ItemView应该是这样:

struct ItemView: View {
    @ObservedObject var choicevwModel = ItemChoiceViewModel() // 修正ViewModel类名
    
    var body: some View {
        Optionspage(choicevwModel: choicevwModel) // 将ViewModel传入子视图
    }
    
    struct Optionspage: View {
        @ObservedObject var choicevwModel: ItemChoiceViewModel
        
        var body: some View {
            List(choicevwModel.OpnChoice.OptionsListByItemId) { opn in
                Text(opn.OptionName ?? "Unknown Option")
                
                ForEach(opn.Choices, id: \.ChoiceId) { choice in
                    Text(choice.ChoiceName ?? "Unknown Choice")
                        .padding(.leading, 20)
                }
            }
        }
    }
}

3. 可选优化:模型中的隐式解包问题

你定义的模型里用了OptionName: String!和ChoiceName: String!这种隐式解包可选类型,如果服务器返回的数据中这些字段可能为空,很容易导致崩溃。建议改成普通可选类型,然后在视图中做默认值处理,比如:

struct OptionsandChoices : Decodable , Identifiable{
    var id: String { OptionName ?? "default-id" } // 确保id不为空
    var OptionName: String? // 改成可选类型
    var OptionId: Int
    var Choices : [ChoiseList]
}

struct ChoiseList: Decodable {
    var ChoiceName: String? // 改成可选类型
    var ChoiceId: Int
}

这样修改后,你的列表就能按照预期展示成:

Temperature
Hot
Cool
Humidity
61%
70%

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 10:37:36