ios - 尝试在 USerDefault 中保存图像时我做错了什么

标签 ios swift nsuserdefaults

我需要获取图像,然后将其保存到 UserDefaults 以便能够检索它。但是,我尝试另存为 UIImage,但是当我尝试检索图像时,应用程序崩溃了。对我来说最好的方法是什么?

这就是我尝试保存图片的方式。

import UIKit

protocol dataReceivedDelegate {
    func dataReceived(fotoSaved:[UIImage],nameSaved:NSArray)
}

class adicionarNovoItemVc: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UITextFieldDelegate {

    @IBOutlet weak var textFieldNome: UITextField!
    let imagePicker = UIImagePickerController()
    @IBOutlet weak var namePreview: UILabel!
    @IBOutlet weak var imagePreview: UIImageView!
    let picker = UIImagePickerController()
    var arrayName = [String]()
    var arrayFoto = [UIImage]()
    var delegate:dataReceivedDelegate? = nil

    override func viewDidLoad() {
        super.viewDidLoad()
        self.textFieldNome.delegate = self
        // Do any additional setup after loading the view.
        if isKeyPresentInUserDefaults(key: "namesSavedArray") == true{
            arrayName = UserDefaults.standard.array(forKey: "namesSavedArray") as! [String]
        }
        if isKeyPresentInUserDefaults(key: "fotoSavedArray") == true{
            arrayFoto = UserDefaults.standard.array(forKey: "fotoSavedArray") as! [UIImage]
        }
    }
    func isKeyPresentInUserDefaults(key: String) -> Bool {
        return UserDefaults.standard.object(forKey: key) != nil
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let image = info[.originalImage] as? UIImage {
            self.imagePreview.image = image
            self.namePreview.text = self.textFieldNome.text
        }
        self.picker.dismiss(animated: true, completion: nil)
    }


    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        self.textFieldNome.resignFirstResponder()
        return true
    }

    @IBAction func botaoAdcItem(_ sender: UIButton) {
        if (self.namePreview!.text != nil) && (self.imagePreview!.image != nil) {
            if delegate != nil {

                arrayName.append(self.namePreview.text!)
                arrayFoto.append(self.imagePreview.image!)

                delegate?.dataReceived(fotoSaved: arrayFoto, nameSaved: arrayName as NSArray)

                UserDefaults.standard.set(arrayName, forKey: "namesSavedArray")
                UserDefaults.standard.set(arrayFoto, forKey: "fotoSavedArray")

            self.navigationController?.popViewController(animated: true)
            }
        }
        else {return}
}

最佳答案

您不能也不应该将图像存储到 UserDefaultsUserDefaults 旨在保存简短的内容,例如用户输入的字符串或首选项设置。

它只能保存一个简短的数据类型列表(“属性列表”对象:Array、Dictionary、String、Data、Date、整数类型、浮点类型或 Bools)。任何其他数据类型都会失败。

我建议将图像保存到用户的 Documents 目录,然后在 UserDefaults 中保存文件的路径。

关于ios - 尝试在 USerDefault 中保存图像时我做错了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51256305/

相关文章:

ios - XCode5 中两个 UITableView 之间的奇怪纠缠

ios - 重新加载时 UICollectionViewCell 问题?

swift - 使用 segue 的 datePicker 日期

ios - 如何解析 "Initializer for conditional binding must have Optional type, not ' Int'”?

ios - 未调用 PreferredStatusBarStyle

ios - [String : AnyObject] be an AnyObject, 但 [String : AnyObject? ] 怎么可能不行?

swift - 查询中的查询不附加 Swift/Parse

arrays - 如何使用 swift 将自定义结构数组保存到 NSUserDefault?

interface-builder - 使用 NSArrayController 添加对象时使 NSTableView 行可编辑

ios - 使用 UITableView Cell 中的 segue 更新数据