我在将图像保存到 SwiftData 时遇到问题,并且我不完全确定最好的方法。
我有一个用于单个条目的 EntryModel 数据模型,如下所示:
@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
}
然后我创建了一个 NewEntryView,它允许用户创建一个新条目,并附加一些可选的图片来提供额外的信息。代码如下:
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
}
现在,通过当前的实现,我确实可以从我的相册中选择图像并将它们填充到 HStack 中。
当单击底部的按钮时,用户填写的其他信息也会保存到 SwiftData 中,并可在整个应用程序中使用。
我遇到的问题是将这些图像保存到 SwiftData 中以供整个应用程序使用。
我是否应该像其他值一样将它们插入到模型上下文中?如果是,该怎么做?
如果不是,那么我该如何更改我当前的代码?
任何帮助都将不胜感激。
顺便说一句,我不确定它是否相关,但自从我实现了 PhotosPicker 后,我在 Xcode 中收到以下警告:
PHPickerViewControllerDelegate_Private 不响应 _pickerDidPerformConfirmationAction: