SwiftUI如何将筛选后的结构体数据正确传递给其他视图
问题原因
错误出在ForEach的索引使用逻辑上:filter返回的new是独立于原items的新数组,遍历new.indices得到的是新数组自身的元素索引,不是对应元素在原items数组中的位置。用这个索引去原数组通过下标取值,取到的永远是原数组对应位置的元素,和筛选条件没有关系。
用你提供的测试数据举例:
- 原数组索引0:status=1,名称Inprogress
- 原数组索引1:status=0,名称New
- 筛选后的
new数组只有1个元素,自身索引为0 - 代码用索引0取原数组元素,拿到的永远是排在第一位的Inprogress,自然不会显示符合条件的新任务
修复方法
方法1:直接遍历筛选后的数组(推荐)
你的Tasks已经实现了Identifiable协议,不需要依赖索引遍历,直接遍历筛选后的数组即可。需要传绑定值时,直接从筛选后的数组取绑定,不要回原数组按下标取值。
将Section块中的代码替换为如下内容:
Section(header:Text("\(size) New")){ ForEach($new) { $item in NavigationLink(destination: ChosenTask()) { CardContentView(item: $item) } } }
方法2:筛选原数组的合法索引
如果习惯用索引遍历,不要先筛元素再拿新数组索引,直接从原数组中筛选出符合条件的索引值,再遍历这些索引访问原数组:
Section(header:Text("\(size) New")){ let matchIndexes = items.indices.filter { items[$0].status == 0 } ForEach(matchIndexes, id: \.self) { idx in NavigationLink(destination: ChosenTask()) { CardContentView(item: self.$items[idx]) } } }
- 额外提示:
ContentsView顶层定义的var size = 0是无用代码,全程没有被赋值和引用,可以直接删除。
内容的提问来源于stack exchange,提问作者Gladium
相关产品推荐
相关产品推荐

