将值(用Firestore数据计算)应用到标签上会触发 "解包一个可选值 "的崩溃。

问题描述 投票:0回答:1

我有成分的价格表,存储在Cloud Firestore中。我想计算特定原料的价格,将其传递给另一个VC并应用到标签上,所以我写了这段代码。

extension RecepiesViewController: UICollectionViewDelegate {
    //Passing data to next VC
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let destinationVC = segue.destination as! ResultViewController
        destinationVC.result = totalPrice
    }
    //Recepie cell pressed
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        print("You selected cell #\(indexPath.item)!")
        // Calculating price for recepie
        func recepieCalculation(_ completion: @escaping (Double) ->()) {     
            for ingridients in cakeRecepies![indexPath.item].ingridientList {
                db.collection("Okey")
                    .document(ingridients.name)
                    .getDocument() { (document, error) in
                        if let document = document, document.exists {
                            let data = document.data()
                            if let price = data!["price"] as? Double, let count = data!["count"] as? Int  {
                                let priceForOne = price / Double(count)
                                self.totalPrice = self.totalPrice + priceForOne * Double(ingridients.count)
                            }
                        } else {
                            print("Document does not exist")
                        }
                        completion(self.totalPrice)
                }
            }
        }
        recepieCalculation {totalPrice in
            self.performSegue(withIdentifier: "goToResult", sender: self)
        }
    }
}

另一个VC代码

import Foundation
import UIKit
import RealmSwift

class ResultViewController: UIViewController {

    @IBOutlet weak var resultLabel: UILabel!
    var result: Double = 0.0 {
        didSet {
            print(result)
            resultLabel.text = String(format: ".%f", result)
        }
    }
    @IBOutlet weak var recepieImage: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

然后在这一行 resultLabel.text = String(format: ".%f", result) 出错

线程1:致命错误。当隐式拆包一个Optional值时,意外发现nil。

会有什么问题?

ios swift firebase google-cloud-firestore uilabel
1个回答
2
投票

这是一个常见的错误。

此刻要呈现的segue的目的控制器的网点还没有连接,所以将该值分配给标签中的 didSet 观察者崩溃。

解决办法。

  • 删除观察者

    var result = 0.0 
    
  • 并将该值赋于 viewDidLoad

    override func viewDidLoad() {
        super.viewDidLoad()
        print(result)
        resultLabel.text = String(format: ".%f", result)
    }
    
© www.soinside.com 2019 - 2024. All rights reserved.