2016-10-19 8 views
0

Я хочу сохранить изображение с изображения Picker с Realm. Он работает, когда я выбираю картинку, но не тогда, когда я ее не выбираю. Я попытался сохранить стандартный образ, когда изображение не выбрано. Но я получаю ошибку: фатальная ошибка: неожиданно обнаружил ноль, а разворачивание необязательное значение Расположение:Неустранимая ошибка: неожиданно найден nil при распаковке Необязательное значение при сохранении NSData в Realm

class Location: Object{ 
dynamic var name = "" 
dynamic var locationDescription = "" 
dynamic var latitude = 0.0 
dynamic var longitude = 0.0 
dynamic var created = NSDate() 
dynamic var category: Category! 
dynamic var imageData: NSData! 
} 

Добавить запись в контроллер:

//Image Picker 
@IBOutlet var imageView: UIImageView! 
let imagePicker = UIImagePickerController() 
var selectedImage = UIImage() 


@IBAction func loadImage(_ sender: AnyObject) { 
    imagePicker.allowsEditing = true 
    imagePicker.sourceType = .photoLibrary 
    imagePicker.mediaTypes =  UIImagePickerController.availableMediaTypes(for: .photoLibrary)! 
    present(imagePicker, animated: true, completion: nil) 
    } 
//MARK: - Delegates Image Picker 
func imagePickerController(_ picker: UIImagePickerController, 
          didFinishPickingMediaWithInfo info: [String : Any]) 
{ 
    selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage 

    imageView.image = selectedImage 

    // Dismiss the picker. 
    self.dismiss(animated: true, completion: nil) 

} 
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 
    dismiss(animated: true, completion: nil) 
} 

func addNewLocation() { 
    let realm = try! Realm() 
    //convert image to NSData 
    let standardData: NSData = UIImagePNGRepresentation(self.imageView.image!)! as NSData 
    let selctedImageData = NSData(data: UIImageJPEGRepresentation(selectedImage, 0.9)!) 
    let emptyData = NSData() 
    // let data = NSData(data: UIImageJPEGRepresentation(selectedImage, 0.9)!) 
    var data = NSData() 

    if selctedImageData == emptyData{ 
     data = standardData 
    } 
    else{ 
     data = selctedImageData 
    } 

    try! realm.write { 
     let newLocation = Location() 


     newLocation.name = self.nameTextField.text! 
     newLocation.category = self.selectedCategory 
     newLocation.locationDescription = self.descriptionTextField.text 
     newLocation.latitude = self.selectedAnnotation.coordinate.latitude 
     newLocation.longitude = self.selectedAnnotation.coordinate.longitude 
     newLocation.imageData = data 


     realm.add(newLocation) 
     self.locations = newLocation 
    } 
} 

Edit: я заменил Категория модель с которая генерируется из запроса.

class Location: Object{ 
... 
dynamic var category = "" 
dynamic var imageData: NSData! 

} 
+0

В 'addNewLocation()', сделать что-то вроде ', если позволить imageView.image' или что-то подобное? – Larme

+0

Я уже пробовал что-то вроде этого. Это не сработало для меня. У вас есть немного более конкретная идея? –

ответ

0

Я решил проблему так:

class Location: Object{ 
dynamic var name = "" 
dynamic var locationDescription = "" 
dynamic var latitude = 0.0 
dynamic var longitude = 0.0 
dynamic var category = "" 
dynamic var imageData: NSData? = nil 

} 


//Image Picker 
@IBOutlet var imageView: UIImageView! 
let imagePicker = UIImagePickerController() 
var selectedImage = UIImage() 


@IBAction func loadImage(_ sender: AnyObject) { 
    imagePicker.allowsEditing = true 
    imagePicker.sourceType = .photoLibrary 
    imagePicker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)! 
    present(imagePicker, animated: true, completion: nil) 
} 
    //MARK: - Delegates Image Picker 
func imagePickerController(_ picker: UIImagePickerController, 
          didFinishPickingMediaWithInfo info: [String : Any]) 
{ 
    selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage 

    imageView.image = selectedImage 

    // Dismiss the picker. 
    self.dismiss(animated: true, completion: nil) 

} 
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 
    dismiss(animated: true, completion: nil) 
} 

func addNewLocation() { 


    let imageData: NSData = UIImagePNGRepresentation(self.imageView.image!)! as NSData 






    let realm = try! Realm() 

    try! realm.write { 
     let newLocation = Location() 

     newLocation.name = self.nameTextField.text! 
     newLocation.category = self.selectedCategory 
     newLocation.locationDescription = self.descriptionTextField.text 
     newLocation.latitude = self.selectedAnnotation.coordinate.latitude 
     newLocation.longitude = self.selectedAnnotation.coordinate.longitude 



     newLocation.imageData = imageData 

     realm.add(newLocation) 
     self.locations = newLocation 
    } 
} 
0

Ваш Location модель имеет два свойства, которые неявно развернутые OPTIONALS (IUOs): category и imageData. IUO в Swift полезны, когда вы знаете, что значение может стоить хранить nil, но вы можете гарантировать, что он никогда не будет доступен в этом состоянии способами, которые компилятор не может использовать автоматически.

В этом случае вы получаете доступ к одному из этих свойств, прежде чем установить его значение в значение, отличное от nil.

Возможно, self.selectedCategory является nil в той точке, где оно относится к объекту newLocation.category? Трудно сказать, учитывая, что вы не включили ничего, что связано с этим значением в вашем образце.

Если вы не можете гарантировать, что эти IUO когда-либо будут установлены на что-то не-nil при доступе, я бы предложил вам определить их как альтернативные варианты вместо этого и обработать их случай с nil.

class Location: Object { 
    dynamic var name = "" 
    dynamic var locationDescription = "" 
    dynamic var latitude = 0.0 
    dynamic var longitude = 0.0 
    dynamic var created = NSDate() 
    dynamic var category: Category? 
    dynamic var imageData: NSData? 
} 
+0

Категория не может быть нулевой. Вам всегда нужно выбирать одну категорию. Я попытался сделать imageData опционным, но не могу найти способ сделать необязательное свойство NSData. –

+0

Сообщение об ошибке, которое вы опубликовали, будет указывать иначе. – jpsim

+0

Я действительно не знаю, что вы имеете в виду. Категорию необходимо выбрать, иначе на экране появится всплывающее окно, в котором говорится, чтобы заполнить все поля. Но я не хочу заставлять выбирать изображение, оно должно быть необязательным. –