首页 > 解决方案 > 清除 UserDefaults.standard.data 信息实际上并没有删除它?

问题描述

我使用此代码通过 .data 事物将 UIImage 保存到 UserDefaults,其中键等于“petPhoto1”:

@IBAction func addPhotoButton(_ sender: Any) {
        
        let picker = UIImagePickerController()
        picker.allowsEditing = false
        picker.delegate = self
        picker.mediaTypes = ["public.image"]
        present(picker, animated: true)
        
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
        
        if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
            image.storeInUserDefaults(for: "petPhoto\(activePet)")
            UserDefaults.standard.set("yes", forKey: "doesImageExist\(activePet)")
        }
        
        dismiss(animated: true, completion: nil)
    }

(中间不相关的东西)

extension UIImage {
    func storeInUserDefaults(with compressionQuality: CGFloat = 0.8, for key:     String) {
    guard let data = self.jpegData(compressionQuality: compressionQuality) else { return }
    let encodedImage = try! PropertyListEncoder().encode(data)
    UserDefaults.standard.set(encodedImage, forKey: key)
    }
}

现在当我像这样擦除它时:

UserDefaults.standard.set(nil, forKey: "petPhoto1")

我仍然可以在设置下我的应用程序的“文档和数据”位置仍然是完整的,并且与原始图像大小相同,这表明它实际上并没有删除它,即使它从加载回来时不再显示用户默认值。

任何人都可以找到解决此问题的方法吗?谢谢!

顺便说一句,如果有帮助,这里是与此问题相关的其他代码:

我在保存图像后显示图像的 ImageViewController 中使用的代码:

@IBOutlet weak var imageView: UIImageView!

override func viewDidLoad() {
        super.viewDidLoad()
        
        activePet = UserDefaults.standard.string(forKey: "activePet")! // activePet = 1 (confirmed with debugging with other, unrelated code
        
        imageView.image = try? UIImage.loadFromUserDefaults(with: "petPhoto\(activePet)")
        
    }

extension UIImage {
    static func loadFromUserDefaults(with key: String) throws -> UIImage? {
         let activePet = UserDefaults.standard.string(forKey: "activePet")!
         guard let data = UserDefaults.standard.data(forKey: "petPhoto\(activePet)") else {
             return nil
         }
         do {
             let decodedImageData = try PropertyListDecoder().decode(Data.self, from: data)
             return UIImage(data: decodedImageData)
         } catch let error {
             throw error
         }
     }
}

标签: iosswiftnsuserdefaults

解决方案


推荐阅读