无法将 ForEach 用于来自 coredata 的不同记录
Posted
技术标签:
【中文标题】无法将 ForEach 用于来自 coredata 的不同记录【英文标题】:Unable to use ForEach for distinct records from coredata 【发布时间】:2021-09-26 10:36:12 【问题描述】:我有一个表格,其中包含来自 5 位不同艺术家的 20 首歌曲,这个数字可以上下浮动,现在我想要一个视图,我可以在其中显示这些独特歌手的导航,他们的图像也在表格中。
所以我只需要基于艺术家姓名的不同记录,我查询 coredata 但是当我在 View 中使用它时,我得到Generic struct 'ForEach' requires that 'NSFetchRequest<NSDictionary>' conform to 'RandomAccessCollection'
现在为了克服这个问题,我使用 id:.self,这也不起作用。
现在我阅读并了解到 ForEach 不喜欢任何未排序的 TYPE,但我无法找到解决此问题的方法,任何人都可以提出任何解决方案,谢谢。
这就是我从核心数据中获取唯一记录的方式
let fetchRequest: NSFetchRequest<NSDictionary> = NSFetchRequest(entityName: "Artists")
init(songLVM: Binding<SongListVM>)
_songLVM = songLVM
fetchRequest.propertiesToFetch = ["artistname"]
fetchRequest.returnsDistinctResults = true
fetchRequest.resultType = .dictionaryResultType
下面是整个文件
import Foundation
import SwiftUI
import CoreData
struct ArtistList: View
@Environment(\.managedObjectContext) var managedObjectContext
@Binding var songLVM: SongListVM
@State var namesFilter = [String]()
//-----
let fetchRequest: NSFetchRequest<NSDictionary> = NSFetchRequest(entityName: "Artists")
init(songLVM: Binding<SongListVM>)
_songLVM = songLVM
fetchRequest.propertiesToFetch = ["artistname"]
fetchRequest.returnsDistinctResults = true
fetchRequest.resultType = .dictionaryResultType
//-----
var body: some View
List
ForEach(fetchRequest) <---- Error here
idx in
NavigationLink(
destination: ArtistSongs(artistName: idx.artistname ?? "no name", songLVM: $songLVM))
ZStack(alignment: .bottomTrailing)
Image(uiImage: UIImage(data: idx.artistImage ?? Data()) ?? UIImage())
.resizable()
.frame(width: 350, height: 350, alignment: .center)
Text(idx.artistname ?? "no name")
.font(Font.system(size: 50, design: .rounded))
.foregroundColor(.white)
【问题讨论】:
你不想在 fetch 的“结果”而不是“fetch 命令”上做一个forEach
吗?
@Larme,谢谢,你想让我将艺术家 1 转移到其他变量,然后为演示中的每个项目做一个循环吗?
【参考方案1】:
一旦你弄清楚你的字典是什么,在你的ForEach
循环中试试这个:
ForEach(dict.sorted(by: >), id: \.key) key, value in
...
编辑1:
@FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \Artists.artistname, ascending: true)],
animation: .default)
private var artists: FetchedResults<Artists>
...
ForEach(artists, id: \.self) artist in
...
【讨论】:
我一定做错了,但在我的代码中,当我这样做时 - ForEach(fetchRequest.sorted(by: >), id: \.key) key, value in ,我得到多个'ForEach' 上的引用初始化程序 'init(_:id:content:)' 等错误要求 'NavigationLink以上是关于无法将 ForEach 用于来自 coredata 的不同记录的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SwiftUI 中从 FetchedResults (CoreData) 中获取 NSOrderedSet
使用 SwiftUI ForEach 从 NSOrderedSet 获取字符串值
当 ForEach 中发生 onDelete 时如何更新其他 CoreData?
无法从 CoreData 加载 5 个随机数据以用于 Widget,有啥想法可以支持吗?