Как получить случайный элемент Core Data из ForEach в виджете

Я работаю над виджетом в 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)
    }
}

Опять же, если я использую приведенный ниже код, по какой-то причине я получаю ошибку нет участника.

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


person phiredrop    schedule 17.03.2021    source источник


Ответы (1)


FetchedResults<Project> - это тип данных коллекции, поэтому у него не будет свойства image1, как у элемента в коллекции типа Project. Вы используете метод 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.

person CSmith    schedule 17.03.2021
comment
Пришлось сохранить изображение (uiImage :) для преобразования данных, но это прекрасно работает, спасибо @CSmith! - person phiredrop; 17.03.2021
comment
К сожалению, я плохо разбираюсь в синтаксисе Image (), я отредактировал ответ. Рад помочь - person CSmith; 17.03.2021