SwiftUI中如何在ForEach中为AnswerRow设置0-3的递增索引?
解决方法
你原来用@State变量i的方式行不通,因为ForEach迭代时不会自动更新这个变量的值,所以每个AnswerRow拿到的index都是初始的0。要实现从0到3的递增索引,有两种常用方案:
方案一:使用enumerated()关联索引与元素
通过数组的enumerated()方法可以同时获取每个元素的索引和值,再转成数组供ForEach遍历:
ForEach(Array(questionsManager.answerChoices.enumerated()), id: \.element.id) { index, answer in AnswerRow(index: index, answer: answer) .environmentObject(questionsManager) }
这里enumerated()返回包含(索引, 元素)的序列,用Array()转成数组后,ForEach通过element.id标识唯一性(和你原来的id逻辑一致),index就是从0开始的递增数值,正好满足需求。
方案二:遍历索引范围直接取元素
如果确定answerChoices固定是4个元素,也可以直接遍历索引范围,再通过索引获取对应元素:
ForEach(0..<questionsManager.answerChoices.count, id: \.self) { index in let answer = questionsManager.answerChoices[index] AnswerRow(index: index, answer: answer) .environmentObject(questionsManager) }
这种方式更直接,但局限性是如果answerChoices元素数量变化,虽能自动适配索引范围,但用\.self作为id可能导致视图刷新异常,因此更推荐第一种方案。
内容的提问来源于stack exchange,提问作者Mikael Mikaelian
相关产品推荐
相关产品推荐

