如何从 Widget 中的 ForEach 获取随机核心数据元素

How to get random Core Data element from ForEach in Widget

我正在 iOS 14 中开发一个小部件,它将显示我的用户提交的来自 Core Data 的图像。目前,我可以显示单个图像,但它不会在项目图像中旋转。它只在小部件中显示单个图像。

在我的 Widget.swift 中,我可以显示图像的唯一方法是使用 ForEach。如果我不使用 ForEach,我会得到错误 Value of type 'FetchedResults<Project>' has no member 'image1'

这是(大部分)工作代码

struct WidgetEntryView : View {
    var entry: Provider.Entry
    @State var projectImage1: Data = .init(count: 0)
    @FetchRequest(entity: Project.entity(), sortDescriptors: []) var project: FetchedResults<Project>
    
    var body: some View {
    
            ForEach((project.prefix(1)), id: \.self) { (project: Project) in
                Image(uiImage: UIImage(data: project.image1 ?? self.projectImage1) ?? UIImage(imageLiteralResourceName: "icon"))
                    .resizable()
                    .aspectRatio(contentMode: .fill)
            }.environment(\.managedObjectContext, managedObjectContext)
    }
}

同样,如果我使用下面的代码,由于某种原因我会收到 no member 错误

struct WidgetEntryView : View {
    var entry: Provider.Entry
    @State var projectImage1: Data = .init(count: 0)
    @FetchRequest(entity: Project.entity(), sortDescriptors: []) var project: FetchedResults<Project>
    
    var body: some View {
        
       Image(uiImage: UIImage(data: project.image1 ?? self.projectImage1) ?? UIImage(imageLiteralResourceName: "icon"))
                    .resizable()
                    .aspectRatio(contentMode: .fill)
        }.environment(\.managedObjectContext, managedObjectContext)
    }
}

如何让 ForEeach 显示随机 project.image1 属性?我试过附加 randomElement()shuffle() 但都不被接受。

这里是完整的Widget.swift:https://pastebin.com/aFMuZ0iz

FetchedResults<Project> 是集合数据类型,因此它不会像 Project 类型集合中的元素那样具有 image1 属性。您正在使用 prefix(1) 方法,该方法 return 包含一个元素的子集合...但它仍然是一个集合。

尝试这样的事情:

if let randomProject: Project = project.randomElement()
{
   Image(uiImage: UIImage(data: randomProject.image1 ?? self.projectImage1))
}
else
{
   Image(uiImage: UIImage(imageLiteralResourceName: "icon"))
}

project.randomElement() 将 return 集合中的随机元素,如果不为空,则为零。