【问题标题】:When i try to update saved data into realm it is crashing, Image is becoming nil while updating当我尝试将保存的数据更新到领域时,它崩溃了,图像在更新时变为零
【发布时间】:2019-10-24 10:30:30
【问题描述】:

当我保存它时,它会正常保存并保存。 当我尝试更新任何东西时,图像变成零并显示空白图像和 当我执行拍摄相机动作时剩余数据变为nil,只需打开相机剩余数据将变为nil。

主要问题是为什么 Image 在更新时变为 nil,其余的都保持不变。只有图像将为空。

我能做些什么来解决这个问题?

    //Navigation and ImagePicekrDelegate are for camera
    var imagePicker: UIImagePickerController!
    @IBOutlet weak var showImage: UIImageView!

    var itemImageVar :UIImage? {
        didSet{

        }

    }

    override func viewWillAppear(_ animated: Bool) {
        showImage.image = itemImageVar
    }

    //TODO: Saving image Here
    var imageData:Data?

    //Select Picture
    @IBAction func choosePhotAction(_ sender: UIButton) {
        imagePicker =  UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.sourceType = .photoLibrary  //This is for opening photo library
        present(imagePicker, animated: true, completion: nil)
    }

   @IBAction func takePhotoActionw(_ sender: UIButton) {
        imagePicker =  UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.sourceType = .camera
        present(imagePicker, animated: true, completion: nil)
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let imageViewer = info[UIImagePickerController.InfoKey.originalImage] {
            imagePicker.dismiss(animated: true,completion: nil)
            showImage.image = imageViewer as! UIImage
            saveImage(image: imageViewer as! UIImage)
        }
    }

    func saveImage(image : UIImage) {
        imageData = (image as! UIImage).jpegData(compressionQuality: 100)
        print(imageData)
    }

    @IBAction func saveBtnAction(_ sender: UIButton) {
        let newArray = Items()//Item is realm Data Model
        newArray.itemName = itemName.text!


 if let data = imageData as Data?  {
                                newArray.itemImage = data
                            }


        newArray.dateWise = Date()

        //MARK: Realm data
        //Creating/saving data here
        if saveFlag == true {
            //This will go to Create data and save
            self.saveItems(item: newArray)
        } else {
            newArray.id = idVar!
            self.updateItems(item: newArray)
        }

        self.navigationController?.popViewController(animated: true)
   }

    func saveItems(item: Items) {
        do {
           try realm.write { //Save/Create
               realm.add(item)
            }
        } catch {
           print("Error in saving \(error)")
        }
    }

   func updateItems(item: Items) {
       do {
           try realm.write {//Save/Create
              realm.add(item, update: .modified)
           }
       } catch {
           print("Error in saving \(error)")
       }
   }

   //Read the data after saving like displying again
   func displayItems() {
      itemArray = realm.objects(Items.self)
   }

显示视图控制器:-

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = self.tableView.dequeueReusableCell(withIdentifier: "ItemDispplayCell", for: indexPath) as! ItemDispplayCell

            if let cellItems = itemArray?[indexPath.row] {

                if let data = item.itemImage as Data? {
                                                 cell.circleImag.image = UIImage(data: data)
                                         }


            }else {
                cell.itemName.text = "No Items Added"
            }


            return cell
           }

  func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
 if let item = itemArray?[indexPath.row] {

            if let data = item.itemImage as Data?  {
                vc.imageVar = UIImage(data: data)
                                          }

}

    func displayItems() {

              itemArray  = realm.objects(Items.self)


            tableView.reloadData()

           }

【问题讨论】:

  • 这里imageData是什么类型newArray.itemImage = imageData as NSData
  • var imageData:Data?
  • 你在哪里给它一个值
  • 请分享更多代码
  • 请再次检查问题,我更新代码。

标签: ios swift uiimageview realm


【解决方案1】:

发生崩溃是因为您强制解开可选值。有更好的方法来处理这种情况。例如使用if let:

if let data = cellItems.itemImage as? Data {
    cell.circleImag.image = UIImage(data: data)) 
}

如果你想从 UIImage 获取Data,你不应该使用imageData as Data?,而是:

let data = image.pngData()

【讨论】:

  • 在我的回答中,您必须在 didFinishPickingMediaWithInfo 中设置 imageData ,这个答案将避免崩溃,但不会解决它
  • 确保将 imageData 设置为 item。顺便提一句。你的代码格式真的很糟糕,很难理解。
  • 为了清楚起见,虽然这个答案包含非常好的信息(它解决了如何在它们为 nil 时处理选项)并从 Image 对象中获取 pngData - 它与以下问题没有任何关系这就是为什么 var 首先是 nil 的原因,因为 OP 认为它不应该是这样。问题状态 (I) 不知道为什么它变成了 nil
  • 只有图像有问题,更新时它变为零。怎么办?
猜你喜欢
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多