2015-04-01 6 views
3

Когда я пытаюсь сохранить изображение в NSUserDefaults, приложение разбилось с этой ошибкой.Ошибка при попытке сохранить изображение в NSUserDefaults с помощью Swift

Почему? Можно ли сохранить изображение с помощью NSUserDefaults? Если нет, то как сохранить изображение?

Изображение ... enter image description here

Код ...

var image1:UIImage = image1 


    var save1: NSUserDefaults = NSUserDefaults.standardUserDefaults() 

    save1.setObject(Info.Image1, forKey: "Image1")  

    save1.synchronize() 

ошибка входа ...

LibC++ abi.dylib: оканчивающиеся неперехваченного исключением типа NSException (lldb)

ответ

10

NSUserDefaults не просто большой грузовик, на который вы можете выбросить все, что захотите. Это серия трубок, которые относятся только к определенным типам.

Что вы можете сэкономить до NSUserDefaults:

  • NSData
  • NSString
  • NSNumber
  • NSDate
  • NSArray
  • NSDictionary

Если вы пытаетесь сохранить что-либо еще до NSUserDefaults, вам, как правило, необходимо архивировать его на объект NSData и хранить его (имея в виду, что вам нужно будет его разблокировать позже, когда вам это понадобится).

Есть два способа превратить объект UIImage в данные. Существуют функции для создания PNG-представления изображения или JPEG-изображения изображения.

Для PNG:

let imageData = UIImagePNGRepresentation(yourImage) 

Для JPEG:

let imageData = UIImageJPEGRepresentation(yourImage, 1.0) 

где второй аргумент является CGFloat, представляющий качество сжатия, с 0.0 являющейся самым низким качеством и 1.0 быть самым высоким качеством , Имейте в виду, что если вы используете JPEG, каждый раз, когда вы сжимаете и распаковываете, если вы используете что-либо, кроме 1.0, вы со временем ухудшаете качество. PNG без потерь, поэтому вы не будете деградировать изображение.

Чтобы получить изображение обратно из объекта данных, есть init метод UIImage сделать это:

let yourImage = UIImage(data:imageData) 

Этот метод не будет работать независимо от того, как вы превратили UIImage объект данных.

+0

Как сохранить его в объект NSData затем разгружает его? –

+0

Переменная UIImage –

+0

Как преобразовать ее обратно в UIImage? –

8

Для того, чтобы сохранить UIImage в NSUserDefaults, вам нужно конвертировать UIImage в NSData используя UIImageJPEGRepresentation(image, 1) затем сохранить его в NSUserDefaults. А с другой стороны, получая его на другом ViewController (в этом же приложении), вы должны получить NSData, а затем преобразовать его в UIImage.

Здесь я пишу небольшой фрагмент кода, чтобы продемонстрировать это. Я попробовал это в Xcode 6,4

/*Code to save UIImage in NSUserDefaults on viewWillDisappear() event*/ 

override func viewWillDisappear(animated: Bool) 
{ 
     super.viewWillDisappear(animated) 
     //Get some image in image variable of type UIImage. 
     var image = .... 
     let defaults = NSUserDefaults.standardUserDefaults() 
     var imgData = UIImageJPEGRepresentation(image, 1) 
     defaults.setObject(imgData, forKey: "image") 

} 
/*Code to get Image and show it on imageView at viewWillAppear() event*/ 

override func viewWillAppear(animated: Bool) 
{ 
    super.viewWillAppear(animated) 
    let defaults = NSUserDefaults.standardUserDefaults() 
    if let imgData = defaults.objectForKey("image") as? NSData 
    { 
     if let image = UIImage(data: imgData) 
     { 
      //set image in UIImageView imgSignature 
      self.imgSignature.image = image 
      //remove cache after fetching image data 
      defaults.removeObjectForKey("image") 
     } 
    } 
} 
+0

if let imgData = NSUserDefaults.standardUserDefaults(). DataForKey ("image") – djdance

+0

Это я успешно пробовал в swift 1.0. Но вы тоже можете это сделать. –

0

Обновление для Swift 3:

Если вы хотите сохранить изображение в UserDefault используется ниже строк кода сохранения и извлечения изображения;

Чтобы сохранить изображение в UserDefault:

if let image = response.result.value { 
      UserDefaults.standard.register(defaults: ["key":UIImageJPEGRepresentation(image, 100)!]) 
      UserDefaults.standard.set(UIImageJPEGRepresentation(image, 100), forKey: "key") 
     } 

Чтобы восстановить изображение из UserDefault и установить его на ImageView:

var mLogoImageView = UIImageView() 

if let imageData = UserDefaults.standard.value(forKey: "key") as? Data{ 
      let imageFromData = UIImage(data: imageData) 
      mLogoImageView.image = imageFromData! 
     } 

Наслаждайтесь .. 

Смежные вопросы