2015-09-05 4 views
4

У меня есть приложение, в котором пользователь делает снимок, и как только изображение будет снято, оно находится в определенном 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 бета • Swift 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 
    } 
} 

Testing:

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

Leo Dabus, Можете ли вы проверить мой вопрос, я думаю, вы можете его решить. http://stackoverflow.com/questions/38035210/appending-images-in-array Спасибо – ZAFAR007

+0

просто сохраните их в папке documentsDirectory или в каталоге поддержки вашего приложения. UserDefaults не предназначены для хранения изображений. –

+0

Не могли бы вы рассказать мне, что является недостатком сохранения изображения в NSUserDefault? – allenlinli

1

Сохранение сгустка данные в NSUserDefaults приведут к огромному снижению производительности для вашего приложения. У вас есть два варианта:

  1. Сохранить изображение в папке кэша в виде файла и использовать NSUserDefaults хранить их путь
  2. Использование CoreData, SQLite или Realm базы данных для хранения изображений. Структура данных ваших данных определит, какой из них более уместен.
Смежные вопросы