2016-10-19 5 views
0

영역이있는 imagePicker에서 이미지를 저장하려고합니다. 사진을 선택할 때 작동하지만 선택하지 않을 때는 작동하지 않습니다. 이미지를 선택하지 않으면 표준 이미지를 저장하려고했습니다. 는하지만 오류를 얻을 : 치명적인 오류 :치명적인 오류 : NSm을 영역에 저장할 때 선택 값의 래핑을 해제하는 동안 예기치 않게 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! 
} 

새 항목 추가 컨트롤러 : 옵션 값 위치를 풀기 동안 예기치 않게 전무을 발견

//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 
    } 
} 

편집 : 나는으로 분류 모델을 대체 쿼리에서 생성 된 문자열입니다. categoryimageData :

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

} 
+0

'imageView.image'하자 또는 이와 유사한 경우 :

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? } 
Larme

+0

나는 이미 이와 비슷한 것을 시도했다. 그것은 나를 위해 일하지 않았다. 좀 더 구체적인 아이디어가 있습니까? –

답변

0

는이 같은 문제를 해결?
0

귀하의 Location 모델은 암시 적으로 풀어 선택적 항목 (IUOs) 두 가지 속성이 있습니다. Swift의 IUO는 값이 nil을 저장해야한다는 것을 알고있을 때 유용하지만 컴파일러가 자동으로 암시 할 수없는 방식으로 해당 상태로 절대 액세스되지 않는다는 것을 보장 할 수 있습니다.

이 경우 값을 nil 이외의 값으로 설정하기 전에 이러한 속성 중 하나에 액세스하고 있습니다.

아마도 self.selectedCategorynewLocation.category 속성에 할당 된 지점에 nil입니까? 샘플에이 값과 관련된 것을 포함시키지 않았다면 말하기가 어렵습니다.

IUO가 액세스 할 때 무언가로 설정된다는 것을 보장 할 수 없다면, 대신 IUO를 옵션으로 정의하고 해당 사항을 특별히 처리하는 것이 좋습니다.()`과 같은 일을 할 addNewLocation`에서

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

범주를 0으로 설정할 수 없습니다. 당신은 항상 하나의 카테고리를 선택해야합니다. imageData를 선택적으로 만들려고했으나 선택적 NSData 속성을 만드는 방법을 찾을 수 없습니다. –

+0

게시 한 오류 메시지는 다르게 표시합니다. – jpsim

+0

나는 당신이 무슨 뜻인지 정말로 모르겠다. 범주를 선택해야합니다. 화면에 모든 필드를 채우는 팝업이 있습니다. 그러나 나는 이미지를 선택하도록 강요하고 싶지 않습니다, 그것은 선택적이어야합니다. –