我希望能够通过SwiftyUserDefaults保存包含UIImages的数组[{"dstCities": ["SF", "LA"], "dstState":"CA"}]
。
所需行为
以下是确切的预期行为:
通过SwiftyUserDefault库将一组UIImages保存到NSUserDefaults
稍后检索图像
代码这是一个非常少的代码
cardImages
错误
我收到以下错误:
尝试设置非属性列表对象( ",{300,300}" )作为关键图像的NSUserDefaults / CFPreferences值 ***由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:'尝试插入非属性列表对象( ",{300,300}" )关键图像'
谢谢!
答案 0 :(得分:2)
用户默认值必须是属性列表。 property list是
String
或NSString
),NSData
,NSDate
),NSNumber
),NSNumber
), UIImage
不是这些,因此UIImage
不是属性列表,也不能属于属性列表。
您需要将图片转换为NSData
,以便将其存储在用户默认设置中。由于UIImage
除了原始像素数据之外还包含一些属性(如scale
和imageOrientation
),因此将UIImage
转换为NSData
的最简单方法是没有损失是creating an archive:
let cardImage: UIImage? = someImage()
let cardImageArchive: NSData = NSKeyedArchiver.archivedDataWithRootObject(cardImage!)
现在,您可以将cardImageArchive
存储在较大的属性列表中,您可以将其存储为用户默认值。
稍后,当您需要从数据重新创建图像时,请执行以下操作:
let cardImageArchive: NSData = dataFromUserDefaults()
let cardImage: UIImage = NSKeyedUnarchiver.unarchiveObjectWithData(cardImageArchive) as! UIImage
答案 1 :(得分:2)
实际上错误消息是清楚的。 UIImage不是属性列表,因此您需要先将其更改为行数据。我将在下面举例说明,但我们不建议使用NSUserDefaults保存像图像这样的大数据。我将使用NSFileManager并将其放在用户文档目录中。无论如何
var newPhotoKey = DefaultsKey<NSArray>("image")
cardImages = [(UIImage(named: "MyImageName.jpg")!)]
var cardImagesRowdataArray: NSData = []
for image in cardImages {
let imageData = UIImageJPEGRepresentation(image, 1.0)
cardImagesRowdataArray.append(imageData)
}
Defaults[theKeyForStoringThisArray] = cardImagesRowdataArray
var arrayToRetreiveWith = Defaults[theKeyForStoringThisArray] as! [NSData]
// here you can use UIImage(data: data) to get it back
如果您不坚持使用SwiftyUserDefaults,可以将其保存在用户文档目录中,以下是如何操作
func saveImage(image: UIImage){
if let imageData = UIImageJPEGRepresentation(image, 1.0) {
let manager = NSFileManager()
if let docUrl = manager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first{
let uniqueName = NSDate.timeIntervalSinceReferenceDate()
let url = docUrl.URLByAppendingPathComponent("\(uniqueName).jpg")
imageData.writeToURL(url, atomically: true)
}
}
}