SwiftUI嵌套ForEach筛选数据:按分类展示盆景内容
解决方案
情况1:CoreData已建立Category与Bonsai的关联关系
如果你的CoreData模型里已经给CategoryModel和BonsaiModel设置了一对多关联(比如CategoryModel有@NSManaged public var bonsais: NSSet?),直接通过关联属性获取对应分类的盆景即可,无需额外筛选:
修改DisclosureGroup内部的遍历代码:
DisclosureGroup(category.name ?? "未命名分类") { // 将遍历全部bonsaiList改为遍历当前分类关联的bonsais ForEach(Array(category.bonsais ?? []), id: \.self) { bonsai in Text((bonsai as? BonsaiModel)?.name ?? "无名盆景") // 替换成你的盆景展示视图 } }
CoreData关联返回的是NSSet类型,需要转成Array才能用ForEach遍历,同时注意类型转换。
情况2:CoreData未建立关联关系,用filter筛选
如果没设置关联,就通过filter方法,根据分类的唯一标识(比如id)匹配对应的盆景:
假设CategoryModel有id属性,BonsaiModel有categoryId属性对应分类id,代码修改如下:
DisclosureGroup(category.name ?? "未命名分类") { ForEach(bonsaiList.filter { $0.categoryId == category.id }, id: \.self) { bonsai in Text(bonsai.name ?? "无名盆景") // 替换成你的盆景展示视图 } }
额外提示
- 优先用CoreData的关联关系,不仅代码简洁,还能利用CoreData的懒加载和数据一致性保障。
- 使用
filter时,确保bonsaiList是已获取的CoreData数据集合(比如@FetchRequest返回的结果)。
内容的提问来源于stack exchange,提问作者DennisHH
相关产品推荐
相关产品推荐

