结帐后上传Firebase

时间:2018-08-21 23:55:46

标签: swift firebase firebase-realtime-database

这是购物应用程序,用户选择了产品后发送到购物车,然后在填写字段后结账,然后按Checkout(付款)将产品的详细信息发送到我的Firebase数据库,请任何人可以帮助我将json用作加载产品在表格单元格上

我知道我没有付款服务,但是在此付款信息字段上将显示姓名,电话号码和位置

[{
    "name": "EGG",
    "price": "3.00",
    "image": "http://partiklezoo.com/Egg/u0001.jpg",
    "description": "one Egg",
    "category": "Food",
    "uid": "u0001"
},]

代码

import UIKit

class CheckoutViewController: DetailViewController, UITableViewDataSource, UITableViewDelegate, UIPickerViewDataSource, UIPickerViewDelegate {

    @IBOutlet var cardNumber: UITextField!
    @IBOutlet var cardExpiryMonth: UITextField!
    @IBOutlet var cardExpiryYear: UITextField!
    @IBOutlet var cardCvv: UITextField!

    @IBOutlet var pickerPickupPoint: UIPickerView!

    @IBOutlet var tableViewOrderDetails: UITableView!

    @IBOutlet var labelTotalPrice: UILabel!


    var model = SingletonManager.model

    override func viewDidLoad() {
        super.viewDidLoad()
        self.configureCheckout()

        self.tableViewOrderDetails.dataSource = self
        self.tableViewOrderDetails.delegate = self

        self.pickerPickupPoint.dataSource = self
        self.pickerPickupPoint.delegate = self

        //Looks for single or multiple taps.
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(CheckoutViewController.dismissKeyboard))
        view.addGestureRecognizer(tap)

    }

    @objc func dismissKeyboard() {
        //Causes the view (or one of its embedded text fields) to resign the first responder status.
        self.view.endEditing(true)
    }

    func configureCheckout() {

        pickerPickupPoint.selectedRow(inComponent: 0)

        labelTotalPrice.text = "$" + String(format: "%.2f", model.calculateCartTotal())

    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return model.cart.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

        cell.textLabel?.text = model.products[Int(model.cart[indexPath.row][0])].name
        cell.detailTextLabel?.text = String(Int(model.cart[indexPath.row][1])) + " x $" + String(format: "%.2f", model.cart[indexPath.row][4])

        return cell
    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return model.pickUpLocations.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return model.pickUpLocations[row]["street"]! + ", " + model.pickUpLocations[row]["suburb"]!
    }

    @IBAction func payNow(_ sender: Any) {

        var error = ""


        if self.model.cart.count == 0 {
            error = "Your cart is empty."
        }
        else if (self.cardNumber.text?.isEmpty)! {
            error = "Please enter your card number."
        }
        else if (self.cardExpiryMonth.text?.isEmpty)! {
            error = "Please enter the expiry month of your card."
        }
        else if (self.cardExpiryYear.text?.isEmpty)! {
            error = "Please enter the expiry year of your card."
        }
        else if (self.cardCvv.text?.isEmpty)!{
            error = "Please enter the CVV number of your card."
        }



        if error.isEmpty {

            showAlertMsg("Confirm Purchase", message: "Pay " + labelTotalPrice.text!, style: UIAlertControllerStyle.actionSheet)

        }
        else {
            showAlertMsg("Error", message: error, style: UIAlertControllerStyle.alert)
        }

    }

    var alertController: UIAlertController?

    func showAlertMsg(_ title: String, message: String, style: UIAlertControllerStyle) {

        self.alertController = UIAlertController(title: title, message: message, preferredStyle: style)

        if style == UIAlertControllerStyle.actionSheet {
            alertController?.addAction(UIAlertAction(title: "Pay", style: .default, handler: { _ in
                self.checkout()
            }))

            alertController?.addAction(UIAlertAction(title: "Cancel", style: .cancel))
        } else {
            alertController?.addAction(UIAlertAction(title: "Okay", style: .default))
        }

        self.present(self.alertController!, animated: true, completion: nil)

    }







    func checkout() {


        var success = true

        for count in 0...self.model.cart.count - 1 {

            let product = self.model.products[Int(self.model.cart[count][0])]
            let quantity = Int(self.model.cart[count][1])
            let total = self.model.cart[count][4]

            let material = self.model.cart[count][3] == 0.0 ? "pla" : "abs"
            let painting = self.model.cart[count][2] == 0.0 ? "false" : "true"


            let temp = self.model.purchase(product: product, quantity: quantity, total: total, material: material, painting: painting)

            if !temp {
                success = false
            }

        }

        if !success {
            let error = "Oops! Something went wrong. Please try again later."
            showAlertMsg("Error", message: error, style: UIAlertControllerStyle.alert)

        } else {
            print("Success! Checkout complete.")

            self.cardNumber.text = ""
            self.cardExpiryMonth.text = ""
            self.cardExpiryYear.text = ""
            self.cardCvv.text = ""

            self.labelTotalPrice.text = "$0.00"

            self.model.clearCart()
            self.tableViewOrderDetails.reloadData()

            self.performSegue(withIdentifier: "Thankyou", sender: self)

        }

    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let confirmationVc = (segue.destination as! UINavigationController).topViewController as! ConfirmationViewController

        confirmationVc.location = self.model.pickUpLocations[self.pickerPickupPoint.selectedRow(inComponent: 0)]


    }

}
  

这是我的目标

Class Model: NSObject, CLLocationManagerDelegate {

var segueArray = [String]()
var seguesDictionary = Dictionary<String, UIImage>()

var products = [Product]()
var storedProducts = [NSManagedObject]()

var cart = [[Double]]()
var storedCart = [NSManagedObject]()

var pickUpLocations = [[String: String]]()

let locationManager = CLLocationManager()

override init() {

    super.init()

    segueArray.append("Home")
    segueArray.append("List")
    segueArray.append("Search")
    segueArray.append("Cart")
    segueArray.append("Finder")
    segueArray.append("Checkout")

    seguesDictionary["Home"] = UIImage(named: "home")
    seguesDictionary["List"] = UIImage(named: "list")
    seguesDictionary["Search"] = UIImage(named: "search")
    seguesDictionary["Cart"] = UIImage(named: "cart")
    seguesDictionary["Finder"] = UIImage(named: "finder")
    seguesDictionary["Checkout"] = UIImage(named: "checkout")

    self.loadProducts()
    self.refreshProducts()
    self.loadCart()
    self.configureLocManager()
}

func loadProducts() {
    let managedContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Products")

    do {

        let results = try managedContext.fetch(fetchRequest)
        storedProducts = results as! [NSManagedObject]

        if storedProducts.count > 0 {
            for index in 0...storedProducts.count - 1 {

                let binaryData = storedProducts[index].value(forKey: "image") as! Data
                let image = UIImage(data: binaryData)

                let name = storedProducts[index].value(forKey: "name") as! String
                let price = storedProducts[index].value(forKey: "price") as! Double
                let details = storedProducts[index].value(forKey: "details") as! String
                let category = storedProducts[index].value(forKey: "category") as! String
                let uid = storedProducts[index].value(forKey: "uid") as! String

                let loadedProduct = Product(name: name, price: price, image: image!, details: details, category: category, uid: uid)

                products.append(loadedProduct)

            }
        }
    }
    catch let error as NSError
    {
        print("Could not load. \(error), \(error.userInfo)")
    }
}

func refreshProducts() {

    let url = NSURL(string: "http://partiklezoo.com/3dprinting/")
    let config = URLSessionConfiguration.default
    config.isDiscretionary = true
    let session = URLSession(configuration: config)
    let task = session.dataTask(with: url! as URL, completionHandler:
    {(data, response, error) in

        let json = JSON(data: data!)

        for count in 0...json.count - 1
        {
            let newProduct = Product()
            newProduct.name = json[count]["name"].string
            newProduct.price = Double(json[count]["price"].string!)
            newProduct.details = json[count]["description"].string
            newProduct.category = json[count]["category"].string
            newProduct.uid = json[count]["uid"].string

            let imgURL = json[count]["image"].string!

            self.addItemToList(newProduct, imageURL: imgURL)
        }

    })
    task.resume()
}

func checkForProduct(_ searchItem: Product) -> Int {
    var targetIndex = -1

    if products.count > 0 {
        for index in 0...products.count - 1 {
            if products[index].uid == searchItem.uid {
                targetIndex = index
            }
        }

    }

    return targetIndex
}

func addItemToList(_ newProduct: Product!, imageURL: String) {

    if checkForProduct(newProduct) == -1 {
        let managedContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        let picture = UIImageJPEGRepresentation(loadImage(imageURL), 1)
        let entity = NSEntityDescription.entity(forEntityName: "Products", in: managedContext)
        let productToAdd = NSManagedObject(entity: entity!, insertInto: managedContext)

        productToAdd.setValue(newProduct.category, forKey: "category")
        productToAdd.setValue(newProduct.details, forKey: "details")
        productToAdd.setValue(picture, forKey: "image")
        productToAdd.setValue(newProduct.name, forKey: "name")
        productToAdd.setValue(newProduct.price, forKey: "price")
        productToAdd.setValue(newProduct.uid, forKey: "uid")

        do
        {
            try managedContext.save()
        }
        catch let error as NSError
        {
            print("Could not save. \(error), \(error.userInfo)")
        }

        storedProducts.append(productToAdd)
        newProduct.image = UIImage(data: picture!)
        products.append(newProduct)

    }
}

func loadCart() {
    let managedContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Cart")

    do {

        let results = try managedContext.fetch(fetchRequest)
        storedCart = results as! [NSManagedObject]

        if storedCart.count > 0 {
            for index in 0...storedCart.count - 1 {

                let product = storedCart[index].value(forKey: "product") as! Double
                let quantity = storedCart[index].value(forKey: "quantity") as! Double
                let finish = storedCart[index].value(forKey: "finish") as! Double
                let material = storedCart[index].value(forKey: "material") as! Double
                let totalPrice = storedCart[index].value(forKey: "total") as! Double

                let temp = [product, quantity, finish, material, totalPrice]

                cart.append(temp)

            }
        }
    }
    catch let error as NSError
    {
        print("Could not load. \(error), \(error.userInfo)")
    }

}

func addToCart(product: Product, quantity: Double, finish: Double, material: Double, totalPrice: Double) {
    let managedContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    let entity = NSEntityDescription.entity(forEntityName: "Cart", in: managedContext)
    let productToAdd = NSManagedObject(entity: entity!, insertInto: managedContext)
    productToAdd.setValue(checkForProduct(product), forKey: "product")
    productToAdd.setValue(quantity, forKey: "quantity")
    productToAdd.setValue(finish, forKey: "finish")
    productToAdd.setValue(material, forKey: "material")
    productToAdd.setValue(totalPrice, forKey: "total")

    do
    {
        try managedContext.save()
    }
    catch let error as NSError
    {
        print("Could not save. \(error), \(error.userInfo)")
    }

    let temp = [Double(checkForProduct(product)), quantity, finish, material, totalPrice]

    storedCart.append(productToAdd)
    cart.append(temp)

}

1 个答案:

答案 0 :(得分:0)

我不确定我是否理解问题,但是从注释中我认为OP正在要求将示例代码放入操作按钮中,以将日期写入Firebase。所以就在这里。

(注意:请参见评论,因为OP并没有澄清他的要求,因此尚不清楚这是否是答案)

从在视图控制器中初始化Firebase开始

class ViewController: UIViewController {
    var ref: DatabaseReference!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.ref = Database.database().reference()

然后按下按钮,将两个汽车写入“ car_list”节点中的火力发源地

 @IBAction func button0Action(_ sender: Any) {
        let itemDict0 = [
            "Name": "Car",
            "price": "2000"]

        let itemDict1 = [
            "Name": "Car",
            "price": "3000"]

        let carRef = self.ref.child("car_list")

        carRef.childByAutoId().setValue(itemDict0)
        carRef.childByAutoId().setValue(itemDict1)
    }

Firebase中的结果如下所示:

car_list
   -LKYuRKpLL_JXsDGsYWY
      Name: "Car"
      Price: "2000"
   -LKYuRKpLL_JXsDGsYWZ
      Name: "Car"
      Price: "3000"

编辑:我最初根据问题中的数据将其设置为购物清单,但根据OP的评论,他们希望将其设为汽车和价格,所以现在就是这样。