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

