Estou tendo problemas para salvar imagens no SwiftData e não tenho certeza da melhor maneira de fazer isso.
Tenho um modelo de dados EntryModel para uma entrada individual como tal:
@Model
class EntryModel {
var type: EntryType
var who: UserModel
var what: String
var value: Double? = nil
var note: String
@Attribute(.externalStorage) var images: [Data]?
var when: Date = Date.now
init(type: EntryType, who: UserModel, what: String, note: String, images: [Data] = [], when: Date) {
self.type = type
self.who = who
self.what = what
self.note = note
self.images = images
self.when = when
}
Em seguida, tenho uma NewEntryView que permite aos usuários criar uma nova entrada e anexar algumas imagens opcionais para obter informações adicionais. O código fica assim:
struct New EntryView {
@State private var entryItems = [PhotosPickerItem]()
@State private var entryImages = [Image]()
// Other code pertaining to different parts of my form
HStack {
PhotosPicker(selection: $entryItems, maxSelectionCount: 5, matching: .images) {
Image(systemName: "plus")
.font(.title)
.foregroundStyle(.adaptiveBlack)
.frame(width: 80, height: 70)
.background(
RoundedRectangle(cornerRadius: 10)
.stroke(lineWidth: 2)
.fill(selectedEntryType.color)
.frame(width: 70, height: 60)
)
}
ScrollView(.horizontal) {
HStack(spacing: 10) {
ForEach(0..<entryImages.count, id: \.self) { i in
entryImages[i]
.resizable()
.scaledToFill()
.clipShape(RoundedRectangle(cornerRadius: 10))
.frame(height: 60)
}
}
.onChange(of: entryItems) {
Task {
entryImages.removeAll()
for item in entryItems {
if let image = try? await item.loadTransferable(type: Image.self) {
entryImages.append(image)
}
}
}
}
// More code
Button {
let entry = EntryModel(type: selectedEntryType, who: selectedUser!, what: titleTextField, note: noteTextField, when: selectedDate)
modelContext.insert(entry)
} label: {
// Custom label
}
Agora, com esta implementação atual, posso de fato selecionar imagens do meu álbum de fotos e preenchê-las no HStack.
Quando o botão é clicado na parte inferior, as outras informações preenchidas pelo usuário também são salvas no SwiftData e podem ser usadas em todo o aplicativo.
O problema que tenho é salvar essas imagens no SwiftData para serem usadas em todo o aplicativo.
Devo inseri-los no contexto do modelo como faço com os outros valores? Se sim, como?
Caso contrário, como eu alteraria meu código atual?
Qualquer ajuda será apreciada.
Aliás, não tenho certeza da sua relevância, mas desde que implementei o PhotosPicker, recebo o seguinte aviso no Xcode:
PHPickerViewControllerDelegate_Private não responde a _pickerDidPerformConfirmationAction:
Como já mostrei na minha resposta anterior à sua pergunta, use outro modelo para os dados das imagens, com um relacionamento com o EntryModel.
Aqui está um código de exemplo totalmente funcional: