如何在 swift 5

问题描述

我正在尝试将用户图像保存到 userDefaults,但我总是收到错误“线程 1:“尝试为键保存的图像插入非属性列表对象(函数)”这是我的代码

import UIKit

class productSelectionPage: UIViewController {
    @IBOutlet weak var productimageView: UIImageView!


    override func viewDidLoad() {
        super.viewDidLoad()

        // Save image
        let image = UIImage(named: "user")
        let imageData = UIImage.jpegData(image)
        UserDefaults.standard.setValue(imageData,forKey: "savedImage")

    }
    @IBAction func offerButtonTapped(_ sender: UIButton) {
        // present image
        let imageData = UserDefaults.standard.object(forKey: "savedImage")
        let image = UIImage(data: (imageData as! NSData) as Data)
        productimageView.image = image
        // crash

        
        
    }
    

}

解决方法

尝试像这样使用 PropertyListEncoder() 和 Decoder:

func saveImage() {
    guard let data = UIImage(named: "image").jpegData(compressionQuality: 0.5) else { return }
    let encoded = try! PropertyListEncoder().encode(data)
    UserDefaults.standard.set(encoded,forKey: "KEY")
}

func loadImage() {
     guard let data = UserDefaults.standard.data(forKey: "KEY") else { return }
     let decoded = try! PropertyListDecoder().decode(Data.self,from: data)
     let image = UIImage(data: decoded)
}
,

如果您曾经使用过 firebase,您就会明白所有图像和视频都保存为数据而不是像素。

保存到 UserDefaults 时采用了类似的方法

// 存储图像数据

private func store(image: UIImage,forKey key: String,withStorageType storageType: StorageType) {

if let pngRepresentation = image.pngData() {
    
        UserDefaults.standard.set(pngRepresentation,forKey: key)
    
}

}

// 检索图像数据并获取图像

要检索它,我们将获取图像数据

private func retrieveImage(forKey key: String,inStorageType storageType: StorageType) -> UIImage? {

    if let imageData = UserDefaults.standard.object(forKey: key) as? Data,let image = UIImage(data: imageData) {
        
        return image
    }
}

}