当我尝试在NSUserDefaults中保存图像时,应用程序因此错误而崩溃。
为什么呢?是否可以使用NSUserDefaults保存图像?如果没有,那么如何保存图像呢?
...图像
...代码
var image1:UIImage = image1
var save1: NSUserDefaults = NSUserDefaults.standardUserDefaults()
save1.setObject(Info.Image1, forKey: "Image1")
save1.synchronize()
记录错误...
libc ++ abi.dylib:以NSException类型的未捕获异常终止 (lldb)
答案 0 :(得分:12)
NSUserDefaults
不仅仅是一辆大卡车,你可以扔任何你想要的东西。这是一系列只有特定类型的管。
您可以保存到NSUserDefaults
的内容:
NSData
NSString
NSNumber
NSDate
NSArray
NSDictionary
如果您尝试将其他任何内容保存到NSUserDefaults
,则通常需要将其存档到NSData
对象并存储它(请记住,您必须在以后将其取消归档)需要它回来。)
将UIImage
对象转换为数据有两种方法。有用于创建图像的PNG表示或图像的JPEG表示的功能。
对于PNG:
let imageData = UIImagePNGRepresentation(yourImage)
对于JPEG:
let imageData = UIImageJPEGRepresentation(yourImage, 1.0)
其中第二个参数是表示压缩质量的CGFloat
,0.0
是最低质量,1.0
是最高质量。请记住,如果您使用JPEG,每次压缩和解压缩时,如果您使用的是1.0
以外的任何内容,那么随着时间的推移会降低质量。 PNG是无损的,因此您不会降低图像质量。
要从数据对象中取回图像,init
有一个UIImage
方法可以执行此操作:
let yourImage = UIImage(data:imageData)
无论您如何将UIImage
对象转换为数据,此方法都将有效。
答案 1 :(得分:8)
要在UIImage
中保存NSUserDefaults
,您需要使用UIImage
将NSData
转换为UIImageJPEGRepresentation(image, 1)
,然后将其保存在NSUserDefaults
中。另一方面,在另一个ViewController
(在同一个应用程序中)检索它时,您需要获取NSData
,然后将其转换为UIImage
。
在这里,我正在swift中编写小代码片段来演示这一点。我在XCODE 6.4中试过这个
/*Code to save UIImage in NSUserDefaults on viewWillDisappear() event*/
override func viewWillDisappear(animated: Bool)
{
super.viewWillDisappear(animated)
//Get some image in image variable of type UIImage.
var image = ....
let defaults = NSUserDefaults.standardUserDefaults()
var imgData = UIImageJPEGRepresentation(image, 1)
defaults.setObject(imgData, forKey: "image")
}
/*Code to get Image and show it on imageView at viewWillAppear() event*/
override func viewWillAppear(animated: Bool)
{
super.viewWillAppear(animated)
let defaults = NSUserDefaults.standardUserDefaults()
if let imgData = defaults.objectForKey("image") as? NSData
{
if let image = UIImage(data: imgData)
{
//set image in UIImageView imgSignature
self.imgSignature.image = image
//remove cache after fetching image data
defaults.removeObjectForKey("image")
}
}
}
答案 2 :(得分:0)
针对Swift 3进行了更新:
如果要在UserDefault中保存图像,请使用以下代码行保存并检索图像;
在UserDefault中保存图片:
if let image = response.result.value {
UserDefaults.standard.register(defaults: ["key":UIImageJPEGRepresentation(image, 100)!])
UserDefaults.standard.set(UIImageJPEGRepresentation(image, 100), forKey: "key")
}
从UserDefault检索图像并将其设置为ImageView:
var mLogoImageView = UIImageView()
if let imageData = UserDefaults.standard.value(forKey: "key") as? Data{
let imageFromData = UIImage(data: imageData)
mLogoImageView.image = imageFromData!
}
享受..!
答案 3 :(得分:0)
在Swift 4-5
设置:
setImage(image: UIImage(named: "12")!)
func setImage(image : UIImage) {
UserDefaults.standard.set(image.jpegData(compressionQuality: 100), forKey: "key")
}
获取
func getImage() -> UIImage? {
if let imageData = UserDefaults.standard.value(forKey: "key") as? Data{
if let imageFromData = UIImage(data: imageData){
return imageFromData
}
}
return nil
}