2015-09-05 140 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的或領域數據庫來存儲影像。數據的數據結構將決定哪一個更合適。