Сохранение изображения из PhotosPicker в CoreData с помощью SwiftUI
Я хочу, чтобы мои пользователи добавляли/сохраняли фотографии, используяPhotosPicker
иCoreData
но мне очень трудно. На самом деле меня устраивают идентификаторы, даты, значения и строки, но не совсем изображения.
Думаю, все, что мне нужно, находится на этой странице: https://www.hackingwithswift.com/forums/swiftui/saving-images-with-core-data-in-swiftui/1241 , но я не знаю, почему я могу это сделать. Я вообще не обрабатываю это.
Хотелось бы узнать, может ли кто-нибудь сказать мне, что мне следует написать вместо комментариев ниже? Спасибо!
// ContentView.swift
import SwiftUI
struct ContentView: View {
@FetchRequest(sortDescriptors: [SortDescriptor(\.name)]) var cars: FetchedResults<Car>
@State var showForm = false
var body: some View {
VStack {
Button("Add a car", action: { showForm = true })
.fullScreenCover(isPresented: $showForm, content: { FormView() })
ForEach(cars) { car in
Text(car.name!)
// Image(car.image) ???
}
}
}
}
// FormView.swift
import SwiftUI
import PhotosUI
struct FormView: View {
@Environment(\.managedObjectContext) var viewContext
@Environment(\.dismiss) var dismiss
@State var name = ""
// @State var image = of type ??? from @Binding ???
var body: some View {
VStack {
if #available(iOS 16.0, *) {
TextField("Name of the car", text: $name)
PhotosView(image: $image) // @Binding an image ???
Button("Add", action: {
DataController.shared.addCar(name: name, /* image: of type ??? */, context: viewContext)
dismiss()
})
} else {
Text("Sorry, you can't add a car!")
}
}
}
}
@available(iOS 16.0, *)
struct PhotosView: View {
@State var selectedImage: PhotosPickerItem? = nil
@State var selectedImageData: Data? = nil
// @Binding var image: of type ???
var body: some View {
if let selectedImageData, let uiImage = UIImage(data: selectedImageData) {
ZStack {
Image(uiImage: uiImage)
// .onAppear { image = something } ???
Button("Close", action: { /* Something = nil ??? */ })
}
} else {
PhotosPicker("Select an image", selection: $selectedImage, matching: .images, photoLibrary: .shared())
.onChange(of: selectedImage) { newImage in
Task {
if let data = try? await newImage?.loadTransferable(type: Data.self) { selectedImageData = data }
}
}
}
}
}
// CarModel.xcdatamodeld
// Entity: Car
// Attributes: id (UUID), name (String) and image (Binary Data + Allows External Storage)
// DataController.swift
import Foundation
import CoreData
struct DataController {
// Some lines of code
func save(context: NSManagedObjectContext) {
try? context.save
}
func addCar(name: String, /* image: of type ??? */, context: NSManagedObjectContext) {
let car = Car(context: context)
car.id = UUID()
car.name = name
// car.image = of type ???
save(context: context)
}
}