首页 > 解决方案 > 如何将数据从viewcontroller导入到购物车TableView

问题描述

是我以前的视图控制器,我正在尝试将数据从中导入到这个视图控制器中。

这是我的第一个 ViewController 代码(没有给出 ss):


import UIKit
struct jsonstruct: Codable {
    let name: String
    let catalog_visibility: String
    let short_description: String
    let description: String
    let price: String
    let categories: [Categories]
    let images: [Images]
    
    enum CodingKeys: String, CodingKey {
        case name
        case catalog_visibility
        case short_description
        case description
        case price
        case categories
        case images
    }
}

struct Categories: Codable {
    let type: String
    
    enum  CodingKeys: String, CodingKey {
        case type = "name"
    }
}

struct Images: Codable {
    let src: String
}


class ViewController: UIViewController, UISearchBarDelegate {

    @IBOutlet weak var tableView: UITableView!

    @IBOutlet var searchbar: UISearchBar!
    
    var imgdata = [Images]()
    
    var categorydata = [Categories]()
    
    var arrdata = [jsonstruct]()
        
    override func viewDidLoad() {
        super.viewDidLoad()

        self.searchbar.endEditing(true)
        getdata()
               
    }
    @IBAction func cartBtnTapped(_ sender: Any) {
        let detail = self.storyboard?.instantiateViewController(withIdentifier: "CartViewController") as? CartViewController
        self.navigationController?.pushViewController(detail!, animated: true)
    }
    func getdata() {
        
        let url = URL(string: "https://mywebstaging.net/ab/garnier/wp-json/wc/v3/products?consumer_key=ck_4a6a758693004efa43ad311d18b30461e6a03d1f&consumer_secret=cs_41a3324c8f8e950ca75764872ae91ea4e5c9b85b")
        URLSession.shared.dataTask(with: url!) { (data, response, error) in
            do{if error == nil{
                self.arrdata = try JSONDecoder().decode([jsonstruct].self, from: data!)

                    print(self.arrdata)
                    //print(self.arrdata[0].categories.name)
                    DispatchQueue.main.async {
                         self.tableView.reloadData()
                    }
                }
            
            }catch{
                print("Error in get json data")
            }
            
        }.resume()
        
    }
    
}
extension ViewController: UITableViewDelegate, UITableViewDataSource, UIImagePickerControllerDelegate {
    
    
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
        
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        return arrdata.count
     }

     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 
        cell?.img.downloadImage(from: (self.arrdata[indexPath.item].images.first?.src)!)
        cell?.lblName.text = arrdata[indexPath.row].name
        cell?.lblSHDesc.text = arrdata[indexPath.row].categories.first?.type
        cell?.lblDesc.text = arrdata[indexPath.row].short_description
        cell?.lblPrice.text = arrdata[indexPath.row].price
        return cell!
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let detail = self.storyboard?.instantiateViewController(withIdentifier: "DetailViewController") as? DetailViewController
        
        if let urlString = arrdata[indexPath.row].images.first?.src, let url = URL(string: urlString) {
            URLSession.shared.dataTask(with: url) { (data, urlResponse, error) in
                if let data = data {
                    detail?.Image = UIImage(data: data)!
                }
            }.resume()
        }
        detail?.Name = arrdata[indexPath.row].name
        detail?.Name2 = arrdata[indexPath.row].name
        detail?.SH_desc = arrdata[indexPath.row].categories.first!.type
        detail?.Desc = arrdata[indexPath.row].description
        detail?.Price = arrdata[indexPath.row].price

        let imagesArray = arrdata[indexPath.row].images

        if imagesArray.count > 0, let url = URL(string: imagesArray[0].src) {
            URLSession.shared.dataTask(with: url) { (data, urlResponse, error) in
                if let data = data {
                    detail?.Img1 = UIImage(data: data)!
                }
            }.resume()
        }
            
        if imagesArray.count > 1, let url = URL(string: imagesArray[1].src) {
            URLSession.shared.dataTask(with: url) { (data, urlResponse, error) in
                if let data = data {
                    detail?.Img2 = UIImage(data: data)!
                }
            }.resume()
        }
            
        if imagesArray.count > 2, let url = URL(string: imagesArray[2].src) {
            URLSession.shared.dataTask(with: url) { (data, urlResponse, error) in
                if let data = data {
                    detail?.Img3 = UIImage(data: data)!
                }
            }.resume()
        }
        
        self.navigationController?.pushViewController(detail!, animated: true)
    }
}
extension UIImageView {
    func downloadImage(from url: String) {
        let urlRequest = URLRequest(url: URL(string: url)!)
        let task = URLSession.shared.dataTask(with: urlRequest) { (data,response,error) in
            if error != nil {
                print("error")
                return
            }
            DispatchQueue.main.async {
                self.image = UIImage(data: data!)
            }
        }
        task.resume()
        
    }
}


下面是我的 DetailViewController 代码:


import UIKit

class DetailViewController: UIViewController, UIImagePickerControllerDelegate{
    
    var arrdata = [jsonstruct]()
    var categorydata = [Categories]()
    var imgdata = [Images]()
    
    @IBOutlet weak var prodName: UILabel!
    @IBOutlet weak var probName2: UILabel!
    @IBOutlet weak var prodSHDesc: UILabel!
    @IBOutlet weak var prodDesc: UILabel!
    @IBOutlet weak var prodPrice: UILabel!
    @IBOutlet weak var probImage: UIImageView!
    @IBOutlet var container: UIView!
    @IBOutlet var ratingView: UIView!
    @IBOutlet var addToCartbtn: UIView!
    @IBOutlet var one: UIView!
    @IBOutlet var two: UIView!
    @IBOutlet var three: UIView!
    @IBOutlet var imgone: UIImageView!
    @IBOutlet var imgtwo: UIImageView!
    @IBOutlet var imgthree: UIImageView!
    @IBOutlet var cart4View: UIView!
    @IBOutlet var cartCount: UILabel!
    
    
    var Image = UIImage()
    var Name = ""
    var Name2 = ""
    var SH_desc = ""
    var Desc = ""
    var Price = ""
    var Img1 = UIImage()
    var Img2 = UIImage()
    var Img3 = UIImage()
    

    var callback : ((Int)->())?
    var counter1 = 0 {
          didSet {
            cartCount.text = "\(counter1)"
          }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()

        probImage.image = Img1
        
        probImage.image = Image
        prodName.text = Name
        probName2.text = Name2
        prodSHDesc.text = SH_desc
        prodDesc.text = Desc
        prodPrice.text = Price
        imgone.image = Img1
        imgtwo.image = Img2
        imgthree.image = Img3
    }
    
    @IBAction func firstImgBtnTapped(_ sender: Any) {
        probImage.image = Img1
    }
    
    @IBAction func secondImgBtnTapped(_ sender: Any) {
        probImage.image = Img2
    }
    
    @IBAction func thirdImgBtnTapped(_ sender: Any) {
        probImage.image = Img3
    }
    
    @IBAction func cartTappedToNavigate(_ sender: Any) {
        let cart = self.storyboard?.instantiateViewController(withIdentifier: "CartViewController") as? CartViewController
        self.navigationController?.pushViewController(cart!, animated: true)
    }
    
    @IBAction func addToCartbtnTapped(_ sender: Any) {
        showAlert()
        counter1 += 1
        callback?(counter1)
        (sender as AnyObject).setTitle("Go to Cart", for: .normal)
        addToCartbtn.isUserInteractionEnabled = false
    }
    
    func showAlert() {
        let alert = UIAlertController(title: "Item Added to Cart", message: nil, preferredStyle: .alert)
   
        alert.addAction(UIAlertAction(title: "Ok", style: .cancel, handler: nil))
        present(alert, animated: true, completion: nil)
    }
    
}

这是 CartViewController 的代码:


import UIKit

class CartViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
    var arrdata = [jsonstruct]()
    var categorydata = [Categories]()
    var imgdata = [Images]()
    
    @IBOutlet var cartTableView: UITableView!
    
    @IBOutlet var totalCount: UILabel!
    
    @IBOutlet var proceedBtn: UIButton!
    
    @IBOutlet var subtotalPrice: UILabel!
    @IBOutlet var shippingPrice: UILabel!
    @IBOutlet var totalPrice: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return arrdata.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CartCellTableViewCell", for: indexPath) as? CartCellTableViewCell

        return cell!
    }
    
}


这是 cellCartViewControllerCell 的代码:


import UIKit

class CartCellTableViewCell: UITableViewCell {
    
    @IBOutlet var cartImageView: UIImageView!
    @IBOutlet var productNameCart: UILabel!
    @IBOutlet var prodductDescCart: UILabel!
    @IBOutlet var productPriceCart: UILabel!
    @IBOutlet var subBtn: UIButton!
    @IBOutlet var prodCount: UILabel!
    @IBOutlet var addBtn: UIButton!
    
    var callback : ((Int)->())?
    var counter1 = 0 {
          didSet {
            prodCount.text = "\(counter1)"
          }
    }
    
    override func awakeFromNib() {
        super.awakeFromNib()
    }
    
    @IBAction func subBtnTapped(_ sender: Any) {
        if counter1 > 0 { counter1 -= 1 }
        callback?(counter1)
    }
    
    @IBAction func addBtnTapped(_ sender: Any) {
        counter1 += 1
        callback?(counter1)
    }
    
    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

    }

}


现在我很困惑如何在将商品添加到购物车时将数据从 detailVewController 传递到 cartTableView。请帮帮我!提前致谢..

更新:这是我现在用于 DetailViewController 的代码

import UIKit

struct CartStruct: Codable {
    let cartItems: [jsonstruct?]
    let cartQuantity: Int

    enum CodingKeys: String, CodingKey {
        case cartItems
        case cartQuantity
    }
}

class DetailViewController: UIViewController {
    
    var categorydata = [Categories]()
    var imgdata = [Images]()

    var detailInfo = [jsonstruct?]()
    var cartArray = [CartStruct]()
    
    @IBOutlet weak var prodName: UILabel!
    @IBOutlet weak var probName2: UILabel!
    @IBOutlet weak var prodSHDesc: UILabel!
    @IBOutlet weak var prodDesc: UILabel!
    @IBOutlet weak var prodPrice: UILabel!
    @IBOutlet weak var probImage: UIImageView!
    @IBOutlet var container: UIView!
    @IBOutlet var ratingView: UIView!
    @IBOutlet var addToCartbtn: UIView!
    @IBOutlet var one: UIView!
    @IBOutlet var two: UIView!
    @IBOutlet var three: UIView!
    @IBOutlet var imgone: UIImageView!
    @IBOutlet var imgtwo: UIImageView!
    @IBOutlet var imgthree: UIImageView!
    @IBOutlet var cart4View: UIView!
    @IBOutlet var cartCount: UILabel!
    
    
    var Image = UIImage()
    var Name = ""
    var Name2 = ""
    var SH_desc = ""
    var Desc = ""
    var Price = ""
    var Img1 = UIImage()
    var Img2 = UIImage()
    var Img3 = UIImage()
    

    var callback : ((Int)->())?
    var counter1 = 0 {
          didSet {
            cartCount.text = "\(counter1)"
          }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()

        probImage.image = Img1
        
        probImage.image = Image
        prodName.text = Name
        probName2.text = Name2
        prodSHDesc.text = SH_desc
        prodDesc.text = Desc
        prodPrice.text = Price
        imgone.image = Img1
        imgtwo.image = Img2
        imgthree.image = Img3
    }
    
    @IBAction func firstImgBtnTapped(_ sender: Any) {
        probImage.image = Img1
    }
    
    @IBAction func secondImgBtnTapped(_ sender: Any) {
        probImage.image = Img2
    }
    
    @IBAction func thirdImgBtnTapped(_ sender: Any) {
        probImage.image = Img3
    }
    
    @IBAction func cartTappedToNavigate(_ sender: Any) {
        let cart = self.storyboard?.instantiateViewController(withIdentifier: "CartViewController") as? CartViewController
        
        self.navigationController?.pushViewController(cart!, animated: true)
    }
    
    @IBAction func addToCartbtnTapped(_ sender: Any) {
        if let info = detailInfo {
            cartArray.append(CartStruct(cartItems: info, cartQuantity: 1))
            cartCount.text = "\(cartArray.count)"
            showAlert()
            (sender as AnyObject).setTitle("Go to Cart", for: .normal)
            addToCartbtn.isUserInteractionEnabled = false
        }       
    }
    
    func showAlert() {
        let alert = UIAlertController(title: "Item Added to Cart", message: nil, preferredStyle: .alert)
   
        alert.addAction(UIAlertAction(title: "Ok", style: .cancel, handler: nil))
        present(alert, animated: true, completion: nil)
    }
    
}

标签: iosswift

解决方案


购物车位置是 ViewController。其他视图应该通过在协议 cartManager 中声明的方法访问购物车(allitems。添加项目,...)协议由视图控制器实现,以更新购物车并将其内容发送到所需的对象。每个对象都应该有一个 cartManager 属性,该属性在从情节提要创建控制器之后实例化。然后这些对象只是用他们需要的方法调用属性。


推荐阅读