尝试在 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
旨在保存用户输入的字符串或首选项设置等简短内容。
它只能保存一小部分数据类型("property list" 对象:Array、Dictionary、String、Data、Date、整数类型、浮点类型或 Bools)。任何其他数据类型都将失败。
我建议将图片保存到用户的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)
}
}
我需要获取图像,然后将其保存到 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
旨在保存用户输入的字符串或首选项设置等简短内容。
它只能保存一小部分数据类型("property list" 对象:Array、Dictionary、String、Data、Date、整数类型、浮点类型或 Bools)。任何其他数据类型都将失败。
我建议将图片保存到用户的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)
}
}