ios - 当我尝试将保存的数据更新到 Realm 时它崩溃了,图像在更新时变为零

标签 ios swift uiimageview realm

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

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

我该怎么做才能解决这个问题?

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

显示 View Controller :-

  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()

           }

最佳答案

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

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

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

let data = image.pngData()

关于ios - 当我尝试将保存的数据更新到 Realm 时它崩溃了,图像在更新时变为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58539393/

相关文章:

ios - 虚线边框 UIImageView swift

ios - 当我拖动 UIImageView 时,在拖动过程中想要与同一 View 上显示的其他 imageView 进行比较

ios - 使用文本字段中的输入计算方程 - Xcode

ios - UIView 动画使 UICollectionView 委托(delegate)变得模糊 - Swift

ios - 如何使用 Facebook 检索到的两个参数

ios - 在 Master-Detail 应用程序中为 Master/Detail View Controller 重用 UIViewController(带有 UITableView)?

ios - UIImageView contentMode 在应用模糊效果后不起作用

ios - 如何在 swift3 中获取子字符串的范围?

iOS 无法从不同的 View Controller 向按钮添加操作

objective-c - 在 objective-c 中声明 swift 协议(protocol)委托(delegate)变量时出错