fatal error: unexpectedly found nil while unwrapping an Optional value when saving NSData to Realm
fatal error: unexpectedly found nil while unwrapping an Optional value when saving NSData to Realm
我想使用 Realm 从 imagePicker 中保存图像。它在我选择图片时起作用,但在我不选择图片时不起作用。当没有选择图像时,我试图保存标准图像。
但我收到错误:致命错误:在展开可选值时意外发现 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
}
}
编辑:
我用查询生成的字符串替换了类别模型。
class Location: Object{
...
dynamic var category = ""
dynamic var imageData: NSData!
}
您的 Location
模型有两个属性是隐式解包选项 (IUO):category
和 imageData
。当您知道值可能必须存储 nil
时,Swift 中的 IUO 很有用,但您可以保证在该状态下永远不会以编译器无法自动暗示的方式访问它。
在这种情况下,您在将其值设置为 nil
以外的值之前访问这些属性之一。
也许 self.selectedCategory
在分配给 newLocation.category
属性 的地方是 nil
?很难说,因为您没有在样本中包含与此值相关的任何内容。
如果您不能保证这些 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?
}
我是这样解决问题的:
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
}
}
我想使用 Realm 从 imagePicker 中保存图像。它在我选择图片时起作用,但在我不选择图片时不起作用。当没有选择图像时,我试图保存标准图像。 但我收到错误:致命错误:在展开可选值时意外发现 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
}
}
编辑: 我用查询生成的字符串替换了类别模型。
class Location: Object{
...
dynamic var category = ""
dynamic var imageData: NSData!
}
您的 Location
模型有两个属性是隐式解包选项 (IUO):category
和 imageData
。当您知道值可能必须存储 nil
时,Swift 中的 IUO 很有用,但您可以保证在该状态下永远不会以编译器无法自动暗示的方式访问它。
在这种情况下,您在将其值设置为 nil
以外的值之前访问这些属性之一。
也许 self.selectedCategory
在分配给 newLocation.category
属性 的地方是 nil
?很难说,因为您没有在样本中包含与此值相关的任何内容。
如果您不能保证这些 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?
}
我是这样解决问题的:
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
}
}