【问题标题】:How to get random Core Data element from ForEach in Widget如何从 Widget 中的 ForEach 获取随机核心数据元素
【发布时间】:2021-06-15 01:18:23
【问题描述】:

我正在开发 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

【问题讨论】:

    标签: ios swift core-data swiftui widgetkit


    【解决方案1】:

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

    试试这样的:

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

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

    【讨论】:

    • 必须保留 Image(uiImage:) 以进行数据转换,但这很好用,谢谢@CSmith!
    • 哎呀我对 Image() 语法不好,我编辑了答案。很高兴为您提供帮助
    猜你喜欢
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    相关资源
    最近更新 更多