我如何使用完成处理程序将值传递给另一个 View Controller
How could I pass value to another View Controller using completion handler
你好,我是 Swift 的新人,我有一个问题。我有配料价目表,存储在 Cloud Firestore 中。我想计算特定收据的价格并将其传递给另一个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() {
}
}
但是控制台中没有打印任何内容。有什么问题吗?
得到
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
}
}
你好,我是 Swift 的新人,我有一个问题。我有配料价目表,存储在 Cloud Firestore 中。我想计算特定收据的价格并将其传递给另一个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() {
}
}
但是控制台中没有打印任何内容。有什么问题吗?
得到
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
}
}