Coredata 图片转换 swiftUI

Coredata Image conversion swiftUI

我正在构建一个简单的 CoreData 应用程序。在某一时刻,用户能够以 NSData 格式上传和存储带有 CoreData 的图像。保存 managedobjectcontext 的工作方式如下:

    let item = Item(context: self.managedObjectContext)

    item.theImage = selectedImageFromPicker.pngData() as NSData?

    //saving the MOC

现在,当我尝试检索图像时,我遇到了一系列问题。

    struct Box {

      var id: Int

      let title: String

      let image: NSData?

    }



    struct BoxView: View {

      let box: Box

      let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

      var item: Item


      var body: some View {

        VStack {


        Image(uiImage: UIImage(data: box.image) as! Data)

        .resizable()
            .frame(width: 120, height: 120, alignment: .center)
            .aspectRatio(contentMode: .fill)

      }

      }

    }

我很确定用包含数据的 UIImage 显示 Image() 在这里是错误的,但我不知道如何将数据转换为 Image() 方法显示的格式。 不幸的是 Xcode 也不会帮助处理它的错误消息,而是将其归咎于 VStack。

也许其他人以前遇到过这种情况并且可以提供帮助,因为我没有在网上找到有关此特定问题的任何信息。

据我了解,您需要如下内容(为了简洁起见,我删除了与图像无关的代码)

var body: some View {
    VStack {
        image
    }
}

var image: some View {
    if let nsData = box.image, let uiImage = UIImage(data: nsData as Data) {
        return AnyView(Image(uiImage: uiImage)
            .resizable()
            .frame(width: 120, height: 120, alignment: .center)
            .aspectRatio(contentMode: .fill))
        }
    return AnyView(EmptyView())
}

这是我的做法。它适用于列表。

我把这个函数放在结构视图中...

func getImageFromData(show: MyShow) -> UIImage  {
        //this is just a placeholder
        var finalImage = (UIImage(systemName: "xmark"))
        if let data = show.image {
            if let image = UIImage(data: data as Data) {
                finalImage = image
                }
            }
            return finalImage!
        }

然后我把它放在正文视图中...

var body: some View {
        NavigationView {
            List {
                ForEach(myShows, id: \.self) { (show: MyShow) in
                    VStack {
                       Image(uiImage: self.getImageFromData(show: show))
        }
    }
}

}