Ios 使用UserDefaults保存图像数组
我有一个应用程序,用户可以在其中拍照,拍照后应保存到Ios 使用UserDefaults保存图像数组,ios,swift,cocoa-touch,nsuserdefaults,Ios,Swift,Cocoa Touch,Nsuserdefaults,我有一个应用程序,用户可以在其中拍照,拍照后应保存到UserDefaults。我不断地发现这个错误: "cannot invoke 'setObject' with an argument list of type '(UIImage. type, forKey:[UIImage])'" 我在这里搜索了文档和帖子,但没有任何帮助。 这是我的密码 let defaults = NSUserDefaults.standardUserDefaults() func imagePickerContr
UserDefaults
。我不断地发现这个错误:
"cannot invoke 'setObject' with an argument list of type '(UIImage. type, forKey:[UIImage])'"
我在这里搜索了文档和帖子,但没有任何帮助。
这是我的密码
let defaults = NSUserDefaults.standardUserDefaults()
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
picker.dismissViewControllerAnimated(true, completion: nil)
switch currentClothesSelection!{
case "1":
shirts.append(info[UIImagePickerControllerOriginalImage] as! UIImage)
//this is where the error occurs
defaults.setObject(UIImage.self, forKey: array1)
case "2" :
pants.append(info[UIImagePickerControllerOriginalImage] as! UIImage)
case "3" :
shorts.append(info[UIImagePickerControllerOriginalImage] as! UIImage)
case "4" :
jackets.append(info[UIImagePickerControllerOriginalImage] as! UIImage)
case "5" :
shoes.append(info[UIImagePickerControllerOriginalImage] as! UIImage)
default:
break
}
编辑/更新:
Xcode 10.1•Swift 4.2.1或更高版本
以NSUserDefaults存储图像不是一个好主意,但如果您确实想这样做,则需要将is存储为NSData
值参数只能是属性列表对象:NSData,
NSString、NSNumber、NSDate、NSArray或NSDictionary。对于NSArray和NSDictionary对象,其内容必须是属性列表对象
我建议将其本地保存到Documents文件夹中的磁盘。如果您确实想将其保存为NSUserDefaults,我建议仅对小图像使用,并自行承担风险:)您可以执行以下操作:
extension UserDefaults {
func set(image: UIImage?, quality: CGFloat = 0.5, forKey defaultName: String) {
guard let image = image else {
set(nil, forKey: defaultName)
return
}
set(image.jpegData(compressionQuality: quality), forKey: defaultName)
}
func image(forKey defaultName:String) -> UIImage? {
guard
let data = data(forKey: defaultName),
let image = UIImage(data: data)
else { return nil }
return image
}
func set(images value: [UIImage]?, forKey defaultName: String) throws {
guard let value = value else {
removeObject(forKey: defaultName)
return
}
try set(NSKeyedArchiver.archivedData(withRootObject: value, requiringSecureCoding: false), forKey: defaultName)
}
func images(forKey defaultName: String) throws -> [UIImage] {
guard let data = data(forKey: defaultName) else { return [] }
let object = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data)
return object as? [UIImage] ?? []
}
}
测试:
let image = UIImage(data: try! Data(contentsOf: URL(string: "https://i.stack.imgur.com/Xs4RX.jpg")!))!
UserDefaults.standard.set(image: image, forKey: "imageKey")
if let loadedImage = UserDefaults.standard.image(forKey: "imageKey") {
print(loadedImage.size) // "(719.0, 808.0)"
}
let images = [image, image]
try? UserDefaults.standard.set(images: images, forKey: "imagesKey")
if let loadedImages = try? UserDefaults.standard.images(forKey: "imagesKey") {
print(loadedImages.count) // 2
}
在NSUserDefaults中保存blob数据将对您的应用程序造成巨大的性能损失。您有两个选择:
利奥·达布斯,你能检查一下我的问题吗?我想你能解决它。感谢您必须将它们保存到Documents目录或您的应用程序支持目录。用户默认值不用于存储图像请告诉我将图像保存到NSUserDefault的缺点是什么?属性列表不用于存储图像。为什么需要将它们保存在plist文件中,而不是直接写入磁盘?