[当我保存时,请正常保存。当我尝试更新任何东西时,它在Display ViewController-> cell.circleImag.image时崩溃,而在更新它时,它使该图像变为NIL,但不知道为什么它变成nil并在circleImage.image时崩溃。
我该怎么解决?
保存数据viewController:-
//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)
}
@IBAction func saveBtnAction(_ sender: UIButton) {
let newArray = Items()//Item is realm Data Model
newArray.itemName = itemName.text!
let price = Float(itemPrice.text!)
newArray.price = price!
let cost = Float(itemCost.text!)
newArray.cost = cost!
let barcode = Int(itemBarCode.text!)
newArray.barcCode = barcode!
let stock = Int(itemStock.text!)
if switchBtn.isOn {
newArray.switchBtn = true
newArray.trackStock = stock!
//
}
else {
newArray.switchBtn = false
//
newArray.trackStock = 0
}
//This is used for saving image
newArray.itemImage = imageData as 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)
}
显示ViewController:-
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] {
cell.circleImag.image = UIImage(data: ((cellItems.itemImage as Data?)!))//Here i am getting error as Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
cell.itemName.text = cellItems.itemName
cell.itemPrice.text = "\(cellItems.price)"+" INR"
cell.stockCount.text = cellItems.trackStock != 0 ? "\(cellItems.trackStock)"+" in stock" : ""
}else {
cell.itemName.text = "No Items Added"
}
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
vc.itemStockVar = String(item.trackStock)
vc.itemSwitchVar = item.switchBtn
vc.itemImageVar = UIImage(data: (item.itemImage! as Data?)! )//Here image
}
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()