【问题标题】:How could I pass value to another View Controller using completion handler如何使用完成处理程序将值传递给另一个视图控制器
【发布时间】:2020-09-19 04:33:14
【问题描述】:

您好,我是 Swift 新手,但遇到了问题。我有存储在 Cloud Firestore 中的成分价格表。我想计算特定recepie的价格并将其传递给另一个VC,所以我写了这段代码:

extension RecepiesViewController: UICollectionViewDelegate {
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        func recepieCalculation(_ completion: @escaping (Double) ->()) {
            var totalPrice = 0.0
            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)
                                totalPrice = totalPrice + priceForOne * Double(ingridients.count)
                            }
                        } else {
                            print("Document does not exist")
                        }
                        completion(totalPrice)       
                }

            }
        }
        recepieCalculation {totalPrice in
            func prepare(for segue: UIStoryboardSegue, sender: Any?) {
                let destinationVC = segue.destination as! ResultViewController
                destinationVC.result = totalPrice
            }
            self.performSegue(withIdentifier: "goToResult", sender: self)
        }   
    }
}

第二个VC代码:

class ResultViewController: UIViewController {
    var result: Double? {
        didSet {
            print(result)
        }
    }
    @IBOutlet weak var recepieImage: UIImageView!
    override func viewDidLoad() {   
    }
}

但是没有打印到控制台。有什么问题?

【问题讨论】:

    标签: swift asynchronous google-cloud-firestore closures completionhandler


    【解决方案1】:

    获取

     func prepare(for segue: UIStoryboardSegue, sender: Any?) {
          let destinationVC = segue.destination as! ResultViewController
          destinationVC.result = totalPrice
     }
    

    走出完成

    extension RecepiesViewController: UICollectionViewDelegate {
        func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
            recepieCalculation {totalPrice in
                self.performSegue(withIdentifier: "goToResult", sender: self)
            }   
        }
        func recepieCalculation(_ completion: @escaping (Double) ->()) {
            var totalPrice = 0.0
            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)
                                totalPrice = totalPrice + priceForOne * Double(ingridients.count)
                            }
                        } else {
                            print("Document does not exist")
                        }
                        completion(totalPrice)       
                }
    
            }
        }
        func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            let destinationVC = segue.destination as! ResultViewController
            destinationVC.result = totalPrice
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      • 2021-12-20
      • 2012-05-02
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多