尝试使用 Swift 在 NSUserDefaults 中保存图像时出错
Error when trying to save image in NSUserDefaults using Swift
当我尝试在 NSUserDefaults 中保存图像时,应用程序崩溃并出现此错误。
为什么?是否可以使用 NSUserDefaults 保存图像?如果没有,那我该如何保存图片呢?
图片...
代码...
var image1:UIImage = image1
var save1: NSUserDefaults = NSUserDefaults.standardUserDefaults()
save1.setObject(Info.Image1, forKey: "Image1")
save1.synchronize()
日志错误...
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
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 是无损的,因此您不会降低图像质量。
要从数据对象中取回图像,UIImage
有一个 init
方法来执行此操作:
let yourImage = UIImage(data:imageData)
无论您如何将 UIImage
对象转换为数据,此方法都有效。
在 Swift 的较新版本中,函数已重命名和重组,现在调用为:
对于 PNG:
let imageData = yourImage.pngData()
对于 JPEG:
let imageData = yourImage.jpegData(compressionQuality: 1.0)
尽管 Xcode 会为您自动更正旧版本
为了在NSUserDefaults
中保存UIImage
,您需要使用UIImageJPEGRepresentation(image, 1)
将UIImage
转换为NSData
,然后将其保存在[=12=中].另一方面,在另一个 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")
}
}
}
Updated for 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!
}
享受..!
在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
}
当我尝试在 NSUserDefaults 中保存图像时,应用程序崩溃并出现此错误。
为什么?是否可以使用 NSUserDefaults 保存图像?如果没有,那我该如何保存图片呢?
图片...
代码...
var image1:UIImage = image1
var save1: NSUserDefaults = NSUserDefaults.standardUserDefaults()
save1.setObject(Info.Image1, forKey: "Image1")
save1.synchronize()
日志错误...
libc++abi.dylib: terminating with uncaught exception of type NSException (lldb)
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 是无损的,因此您不会降低图像质量。
要从数据对象中取回图像,UIImage
有一个 init
方法来执行此操作:
let yourImage = UIImage(data:imageData)
无论您如何将 UIImage
对象转换为数据,此方法都有效。
在 Swift 的较新版本中,函数已重命名和重组,现在调用为:
对于 PNG:
let imageData = yourImage.pngData()
对于 JPEG:
let imageData = yourImage.jpegData(compressionQuality: 1.0)
尽管 Xcode 会为您自动更正旧版本
为了在NSUserDefaults
中保存UIImage
,您需要使用UIImageJPEGRepresentation(image, 1)
将UIImage
转换为NSData
,然后将其保存在[=12=中].另一方面,在另一个 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")
}
}
}
Updated for 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!
}
享受..!
在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
}