【问题标题】:SwiftUI - How to Save selected Image to CoreData and Retrieve it from another ViewSwiftUI - 如何将选定的图像保存到 CoreData 并从另一个视图中检索它
【发布时间】:2021-11-10 03:52:39
【问题描述】:

我正在使用允许用户上传个人资料图片的图像选择器。但是我不知道如何在选择后保存图像。这是我正在使用的图像选择器代码。保存后,我还想在另一个视图中检索图像并显示它。

image!
    .resizable()
    .aspectRatio(contentMode: .fill)
    .frame(width: 150, height: 150)
    .clipShape(Circle())
    .overlay(Circle().stroke(Color.white, lineWidth: 4))
    .shadow(radius: 10)
    .onTapGesture { self.shouldPresentActionScheet = true }
    .sheet(isPresented: $shouldPresentImagePicker) {
        SUImagePickerView(sourceType: self.shouldPresentCamera ? .camera : .photoLibrary, image: self.$image, isPresented: self.$shouldPresentImagePicker)
    }.actionSheet(isPresented: $shouldPresentActionScheet) { () -> ActionSheet in
        ActionSheet(title: Text("Choose mode"), message: Text("Please choose your preferred mode to set your profile image"), buttons: [ActionSheet.Button.default(Text("Camera"), action: {
            self.shouldPresentImagePicker = true
            self.shouldPresentCamera = true
        }), ActionSheet.Button.default(Text("Photo Library"), action: {
            self.shouldPresentImagePicker = true
            self.shouldPresentCamera = false
        }), ActionSheet.Button.cancel()])
        
    }

【问题讨论】:

    标签: ios image core-data swiftui


    【解决方案1】:

    将图像保存到 Core Data 不是一个好习惯,因为您需要在保存数据时将其编码为数据,并在检索时从数据中解码。另外,我读过存在性能问题。最佳实践是使用本地存储来保存图像,Core Data 在存储中保存图像的路径。可以这样完成。最好设置一个唯一的图像名称,如 UUID()

    func saveToDocumentDirectory(imageId: String) {
            if let image = takenImage, let data = image.jpegData(compressionQuality: 0.7) {
                do {
                    let filename = getDocumentsDirectory().appendingPathComponent(imageId)
                    try data.write(to: filename, options: [[.atomicWrite, .completeFileProtection]])
                } catch {
                    print("error saving data")
                }
            }
        }
    

    您可以在创建 Core Data 对象时调用此函数,例如

    saveToDocumentDirectory(imageId: object.id.uuidString)
    

    可以用这个方法获取图片:

    func retrieveImage(with id: UUID) {
        let dummyImage = Image(systemName: "person")
            do {
                let filename = getDocumentsDirectory().appendingPathComponent(id.uuidString)
                let data = try Data(contentsOf: filename)
                if let uiImage = UIImage(data: data) {
                    return Image(uiImage: uiImage)
                }
            } catch {
                print("error loading data")
                return dummyImage
            }
            return dummyImage
    }
    

    尝试使用此图像选择器

    
    import SwiftUI
    
    struct ImagePicker: UIViewControllerRepresentable {
        @Environment(\.presentationMode) var presentationMode
        @Binding var takenPicture: UIImage?
        
        class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
            var parent: ImagePicker
            
            init(_ parent: ImagePicker) {
                self.parent = parent
            }
    
            func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
                if let image = info[.originalImage] as? UIImage {
                    parent.takenPicture = image
                }
    
                parent.presentationMode.wrappedValue.dismiss()
            }
        }
        
        
        func makeCoordinator() -> Coordinator {
            Coordinator(self)
        }
    
        func makeUIViewController(context: Context) -> UIImagePickerController {
            let picker = UIImagePickerController()
            picker.sourceType = .camera
            picker.allowsEditing = false
            picker.cameraFlashMode = UIImagePickerController.CameraFlashMode.off
            picker.delegate = context.coordinator
            return picker
        }
        
        func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) {}
    }
    

    【讨论】:

    • 感谢您的意见。正确的输入是将这两个函数添加到图像选择器所在的表单视图中,然后在图像选择器中正确添加“saveToDocumentDirectory(imageId: object.id.uuidString)”。我正在学习构建这个应用程序。对象在代码行中指的是什么?
    • 我的荣幸!正如我从描述中了解到的那样,您有一个图像选择器,您拍了一张照片并想保存它。我不确定您的应用程序的上下文,但是假设您构建了一个应用程序,该应用程序将存储您可以在客厅找到的东西的列表。使用 TextField 你可以命名一个东西,比如说一张沙发,并给它一个唯一的标识符 - UUID()。给定名称后,您可以调用图像选择器,选择图像并使用沙发的 ID 属性保存它。接下来,当您想从本地存储中检索它时,您只需调用 retrieveImage(with: sofa.id)
    • 如果一切都失败了,让我试试@Roma Kavinskyi;我将在 git 上加载我的应用程序,以便您查看。感谢您迄今为止的帮助。
    • 目前进展如何?
    • 我无法过去。通过更多地浏览网络来尝试不同的图像选择器。
    猜你喜欢
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 2020-06-21
    • 2021-07-29
    • 2017-02-12
    相关资源
    最近更新 更多