ios - 如何将数据从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)
}
}
解决方案
购物车位置是 ViewController。其他视图应该通过在协议 cartManager 中声明的方法访问购物车(allitems。添加项目,...)协议由视图控制器实现,以更新购物车并将其内容发送到所需的对象。每个对象都应该有一个 cartManager 属性,该属性在从情节提要创建控制器之后实例化。然后这些对象只是用他们需要的方法调用属性。
推荐阅读
- c# - 从数据网格 WPF 中的单元格中删除焦点
- javascript - 如何计算 Javascript CountUp Timer 中的毫秒数?
- python-3.x - 使用beautifulsoup从同一类的不同li标签中提取锚标签
- nvidia - 在 ubuntu 中运行 mnistCUDNN 示例时出错
- flutter - Flutter:入口点不包含主要功能
- c++ - 如何使用 C++ 中的 new 查询只有一个指针的动态二维数组
- windows - 在 org 模式下导出到 pdf(乳胶)非常慢 Windows10
- android - 级别选择多个屏幕尺寸问题
- python - ImportError:无法从部分初始化的模块“flask”导入名称“Flask”(很可能是由于循环导入)
- spring-boot - Spring WebFlux Reactive 和 Kotlin Coroutines 启动错误