我希望能够保存一个数组cardImages
,该数组通过SwiftyUserDefaults包含UIImages。
期望行为
以下是我们所期望的行为:
通过UIImages库将一个NSUserDefaults数组保存到NSUserDefaults 稍后检索图像
代码这被简化为非常少的代码
var newPhotoKey = DefaultsKey<NSArray>("image")//Setting up the SwiftyUserDefaults Persisted Array
cardImages = [(UIImage(named: "MyImageName.jpg")!)] //This array contains the default value, and will fill up with more
Defaults[theKeyForStoringThisArray] = cardImages //This is the persisted array in which the array full of images should be stored. WHERE THE ERROR HAPPENS
var arrayToRetreiveWith = Defaults[theKeyForStoringThisArray] as! [UIImage] //To Retreive
误差
我得到以下错误:
尝试将非属性列表对象( ",{300,300}“)设置为键图像*终止应用程序的NSUserDefaults/CFPreferences值,原因是:”尝试插入密钥图像的非属性列表对象( ",{300,300}“)
谢谢!
发布于 2015-09-25 14:14:06
实际上,错误信息是明确的。UIImage不是属性列表,因此需要首先将其更改为行数据。我将在下面举个例子,但是FYI不推荐使用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)
}
}
}
发布于 2015-09-25 14:12:17
用户默认值的值必须是属性列表。财产表是
String
或NSString
),NSData
,NSDate
),NSNumber
),NSNumber
),UIImage
不是这些,所以UIImage
不是属性列表,也不能是属性列表的一部分。
您需要将图像转换为NSData
以将其存储在用户默认情况下。由于UIImage
除了包含原始像素数据外,还包含一些属性(如scale
和imageOrientation
),因此将UIImage
转换为没有损失的NSData
的最简单方法是创建存档。
let cardImage: UIImage? = someImage()
let cardImageArchive: NSData = NSKeyedArchiver.archivedDataWithRootObject(cardImage!)
现在,您可以将cardImageArchive
存储在一个更大的属性列表中,您可以将其存储为用户默认设置。
稍后,当您需要从数据重新创建图像时,请执行以下操作:
let cardImageArchive: NSData = dataFromUserDefaults()
let cardImage: UIImage = NSKeyedUnarchiver.unarchiveObjectWithData(cardImageArchive) as! UIImage
https://stackoverflow.com/questions/32791104
复制