2015-09-05 91 views
4

图像阵列I具有其中用户拍照,并且一旦拍摄图像是在一定UICollectionView的应用程序。我一直得到这个错误:与保存NSUserDefaults的

"cannot invoke 'setObject' with an argument list of type '(UIImage. type, forKey:[UIImage])'" 

我已经通过文档和帖子在这里搜索,但没有什么帮助。 这是我的代码。 (注意:我仅在一起案件中出于明显原因)

//userdefualts 
let defualts = 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 
      defualts.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 
    } 

请帮忙。提前致谢。

回答

8

编辑/更新:

的Xcode 8的测试版•斯威夫特3

这不是存储在NSUserDefaults的图像是一个好主意,但如果你真的想这样做,你需要存储是NSData的。

The value parameter can be only property list objects: NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary. For NSArray and NSDictionary objects, their contents must be property list objects

我建议将它本地保存到文件夹中的磁盘上。如果你真的想将它保存到NSUserDefaults的,我建议只使用了小图片和您自己的风险做:)你可以根据以下步骤做:

extension UserDefaults { 
    func set(image: UIImage?, forKey key: String) { 
     guard let image = image else { 
      set(nil, forKey: key) 
      return 
     } 
     set(UIImageJPEGRepresentation(image, 1.0), forKey: key) 
    } 
    func image(forKey key:String) -> UIImage? { 
     guard let data = data(forKey: key), image = UIImage(data: data) 
      else { return nil } 
     return image 
    } 
    func set(imageArray value: [UIImage]?, forKey key: String) { 
     guard let value = value else { 
      set(nil, forKey: key) 
      return 
     } 
     set(NSKeyedArchiver.archivedData(withRootObject: value), forKey: key) 
    } 
    func imageArray(forKey key:String) -> [UIImage]? { 
     guard let data = data(forKey: key), 
      imageArray = NSKeyedUnarchiver.unarchiveObject(with: data) as? [UIImage] 
      else { return nil } 
     return imageArray 
    } 
} 

测试:

let myImage = UIImage(data: try! Data(contentsOf: URL(string:"https://i.stack.imgur.com/Xs4RX.jpg")!))! 
UserDefaults.standard().set(image: myImage, forKey: "anyKey") 
if let myLoadedImage = UserDefaults.standard().image(forKey:"anyKey") { 
    print(myLoadedImage.size) // "(719.0, 808.0)" 
} 

let myImagesArray = [myImage, myImage] 
UserDefaults.standard().set(imageArray: myImagesArray, forKey: "imageArrayKey") 
if let myLoadedImages = UserDefaults.standard().imageArray(forKey:"imageArrayKey") { 
    print(myLoadedImages.count) // 2 
} 
+0

利奥Dabus,你可以请我的问题,我认为你可以解决它。 http://stackoverflow.com/questions/38035210/appending-images-in-array 感谢 – ZAFAR007

+0

只是将它们保存到documentsDirectory或您的应用程序支持目录。 UserDefaults并不意味着存储图像 –

+0

你能告诉我什么是保存图像NSUserDefault的缺点? – allenlinli

1

保存BLOB NSUserDefaults中的数据会对您的应用程序造成巨大的性能损失。你有两个选择:

  1. 在缓存文件夹中保存图像文件和NSUserDefaults的使用来存储它们的路径
  2. 使用CoreData,SQLite的或领域数据库来存储影像。数据的数据结构将决定哪一个更合适。