簡體   English   中英

嘗試在USerDefault中保存圖像時我做錯了什么

[英]What am I doing wrong on try to save image in USerDefault

我必須獲取圖像,然后將其保存到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}
}

您不能也不應將圖像存儲到UserDefaults UserDefaults用於保留簡短內容,例如用戶輸入的字符串或首選項設置。

它只能保存簡短的數據類型列表(“屬性列表”對象:數組,字典,字符串,數據,日期,整數類型,浮點類型或布爾型)。 任何其他數據類型將失敗。

我建議將圖像保存到用戶的Documents目錄,然后在UserDefaults保存文件的路徑。

正如@ Duncan-c所說,您不應將其保存在UserDefaults中。 您可以在UserDefaults中保存所選文件名(URL),並在下次要使用文件名(URL)加載實際圖像時使用。

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
  if let imageURL = info[UIImagePickerControllerImageURL] as! URL? {
    UserDefaults.standard.set(imageURL, forKey: "SelectedImage")
    UserDefaults.standard.synchronize()
  }

  ...  
  picker.dismiss(animated: true, completion: nil)

}

// Load the image
if let imageURL = UserDefaults.standard.url(forKey: "SelectedImage") {
   if let data = NSData(contentsOf: imageURL) as NSData? {
      self. imagePreview.image = UIImage(data: data as Data)
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM