SwiftUI如何创建任意数量状态变量存储动态问卷的用户答案
SwiftUI 动态数量问卷答案存储解决方案
你遇到的报错都是SwiftUI绑定机制的常见问题,我们可以通过以下两种成熟方案实现动态数量题目的答案捕获:
方案一:沿用字典存储,处理可选绑定
字典下标返回的是可选值,直接通过$answers[id]得到的是Binding<String?>类型,和TextField要求的Binding<String>不匹配,且$前缀只能直接修饰属性包装器修饰的变量本身,不能修饰下标/成员访问的结果,这也是你之前$(answers[surveyQuestion.id!]!)写法报错的原因。
我们可以通过自定义绑定解决类型不匹配问题:
@State var answers: [String: String] = [:] ForEach(survey) { surveyQuestion in Text(surveyQuestion.question) // 为当前题目生成非可选的自定义绑定 let answerBinding = Binding( get: { answers[surveyQuestion.id!] ?? "" }, set: { answers[surveyQuestion.id!] = $0 } ) TextField(surveyQuestion.placeholder, text: answerBinding) }
提交问卷时直接读取answers字典即可,键为题目ID,值为对应用户输入的答案。
方案二:答案存入题目模型,遍历数组绑定
你之前修改模型的思路是正确的,报错是因为直接遍历了模型数组的值,没有拿到数组的可变绑定,调整步骤如下:
- 调整题目模型,新增答案字段:
struct SurveyQuestion: Identifiable { let id = UUID() let question: String let placeholder: String var answer: String = "" // 答案字段需用var声明为可变 }
- 将问卷数组声明为状态变量,遍历时取数组绑定:
// 问卷数组用@State修饰 @State var survey: [SurveyQuestion] = [/* 你的动态题目数组 */] ForEach($survey) { $surveyQuestion in // 加$获取单个题目的可变绑定 Text(surveyQuestion.question) TextField(surveyQuestion.placeholder, text: $surveyQuestion.answer) }
提交问卷时遍历survey数组,每个元素的answer属性就是对应用户的输入答案。
内容的提问来源于stack exchange,提问作者ewang
相关产品推荐
相关产品推荐

