ios - 清除 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
}
}
}
解决方案
推荐阅读
- javascript - ReactJS 中的 onChange 事件处理程序
- docker - 我将如何创建 Gradle 应用程序的 docker 容器?
- javascript - 有什么方法可以在按下键时检测到碰撞?
- c++ - 如何在不共享单个变量的情况下计算线程池中已完成的作业?
- javascript - 将 JS 对象关联到 HTML ID
- google-analytics - 如果我在查询中应用数据过滤器,PowerBI 通过连接 Google Analytics 显示错误数据
- javascript - 如何在 NodeJS 中使用 MongoDB 查询进行聚合
- typescript - 在导入的模块(jsonrpc-lite)中声明类型时如何使用类型保护?
- java - 使用 GridLayout 时,如何将组件的大小锁定在可调整大小的框架中?
- matlab - MATLAB - 将路径中的最后一个文件夹保存为字符串?(句法)