Как передать данные из кнопки в TableViewCell в View Controller? - PullRequest
0 голосов
/ 08 октября 2019

У меня есть 2 ViewControllers, один из которых называется ProductListVC, другой - MoreInfoVC. У меня есть tableView на ProductListViewController, который показывает ячейки, несколько меток и кнопок.

MoreInfoVC - это модальное всплывающее виртуальное окно с несколькими метками для бренда, названия и описания. Все мои данные хранятся в Firestore, и я уже создал класс (ProductList), чтобы помочь извлекать данные, представляющие данные в виде таблицы, из облачного Firestore.

Мне нужно использовать кнопку MoreInfo вотдельная ячейка TBV для передачи данных в MoreInfoVC, чтобы она могла представить информацию о выбранном продукте

Теперь я могу легко сделать это либо с помощью метода didSelectRowAt, либо с помощью indexPathForSelectedRow в методе prepare segue. Но в обоих случаях мне нужно нажать на саму ячейку, а не на кнопку.

как бы я мог передавать данные из отдельной ячейки табличного представления через кнопку MoreInfo на MoreInfoVC. Я думаю, что я на правильном пути, поскольку кажется, что мой MoreInfoVC передает данные, но показывает это в данный момент


    import UIKit
    import Firebase
    import FirebaseFirestore

    class ProductListVC: UIViewController {

        @IBOutlet weak var productListTableView: UITableView!

        var productInventory: [ProductList] = []
        var productSetup: [ProductList] = []

        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
        }

        override func viewDidLoad() {
            super.viewDidLoad()

            productListTableView.dataSource = self
            productListTableView.delegate = self
            searchBar.delegate = self

            fetchProducts { (products) in
                self.productSetup = products
                self.productListTableView.reloadData()
            }

        }
       func fetchProducts(_ completion: @escaping ([ProductList]) -> Void) {
           let ref = Firestore.firestore().collection("products")
      ref.addSnapshotListener { (snapshot, error) in
                guard error == nil, let snapshot = snapshot, !snapshot.isEmpty else {
                    return
                }
                completion(snapshot.documents.compactMap( {ProductList(dictionary: $0.data())} ))
            }
        }
    }

    extension ProductListVC: UITableViewDelegate, UITableViewDataSource {
        func numberOfSections(in tableView: UITableView) -> Int {
            return 1
        }
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

            return productSetup.count
        }

        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            guard let cell = tableView.dequeueReusableCell(withIdentifier: "ProductListCell") as?
    ProductListCell else { return UITableViewCell() }

             cell.configure(withProduct: productSetup[indexPath.row])

             cell.delegate = self

          return cell
      }

  }

  extension ProductListVC: ProductListCellDelegate {
      func onTouchInfoButton(from cell: ProductListCell) {
          self.selectedProduct = cell.product
      }

      override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
          self.performSegue(withIdentifier: "MoreInfo", sender: self)
      }
 }

   import UIKit
   import Firebase

   class MoreInfoVC: UIViewController {

        var products: ProductList?

        @IBOutlet weak var productName: UILabel!

        override func viewDidLoad() {
             super.viewDidLoad()

           // Do any additional setup after loading the view.

           productName.text = "\(String(describing: products?.brand)): \(String(describing: products?.name))"
       }

       @IBAction func closeBtn(_ sender: Any) {
            dismiss(animated: true, completion: nil)
            print("Close More Information")
       }
   }

  import UIKit
  import SDWebImage
  import Firebase

  protocol ProductListCellDelegate: class {
      func onTouchInfoButton(from cell: ProductListCell)
  }

  class ProductListCell: UITableViewCell {

      weak var product: ProductList!
      weak var delegate: ProductListCellDelegate?

      @IBOutlet weak var productImage: UIImageView!
      @IBOutlet weak var dispensaryName: UILabel!
      @IBOutlet weak var productName: UILabel!
      @IBOutlet weak var thcPercent: UILabel!
      @IBOutlet weak var cbdPercent: UILabel!
      @IBOutlet weak var categoryLabel: UILabel!
      @IBOutlet weak var categoryStrain: UILabel!

      @IBOutlet weak var moreInfo: RoundButton!

      func configure(withProduct product: ProductList) {
          productName.text = "\(String(describing: product.brand)): \(String(describing: product.name))"
          dispensaryName.text = product.dispensaryName
          categoryLabel.text = product.category
          productImage.sd_setImage(with: URL(string: product.imageUrl))
          cbdPercent.text = product.cbd
          thcPercent.text = product.thc
          categoryStrain.text = product.strain

          self.product = product
      }

      @IBAction func infoButtonAction(_ sender: Any) {
          self.delegate?.onTouchInfoButton(from: self)
      }
  }

1 Ответ

2 голосов
/ 08 октября 2019

Функция @IBAction func infoButtonAction(_ sender: Any) {} должна быть в ProductListCell

При нажатии этой кнопки соединитесь с ProductListVC с помощью delegate или closure, чтобы получить выбранный продукт.

Обновление

Использование делегата: Обновите ProductListCell

import UIKit
import SDWebImage
import Firebase

protocol ProductListCellDelegate: class {
    func onTouchInfoButton(from cell: ProductListCell)
}

class ProductListCell: UITableViewCell {

      @IBOutlet weak var productImage: UIImageView!
      @IBOutlet weak var dispensaryName: UILabel!
      @IBOutlet weak var productName: UILabel!
      @IBOutlet weak var thcPercent: UILabel!
      @IBOutlet weak var cbdPercent: UILabel!
      @IBOutlet weak var categoryLabel: UILabel!
      @IBOutlet weak var categoryStrain: UILabel!

      @IBOutlet weak var moreInfo: RoundButton!
      weak var product: Product!
      weak var delegate: ProductListCellDelegate?

      func configure(withProduct product: ProductList) {
          self.product = product
          productName.text = "\(String(describing: product.brand)): \(String(describing: product.name))"
          dispensaryName.text = product.dispensaryName
          categoryLabel.text = product.category
          productImage.sd_setImage(with: URL(string: product.imageUrl))
          cbdPercent.text = product.cbd
          thcPercent.text = product.thc
          categoryStrain.text = product.strain
      }

      @IBAction func infoButtonAction(_ sender: Any) {
          self.delegate?.onTouchInfoButton(from: self)
      }
}

В вашем ProductListVC:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            guard let cell = tableView.dequeueReusableCell(withIdentifier: "ProductListCell") as?
    ProductListCell else { return UITableViewCell() }

    cell.configure(withProduct: productSetup[indexPath.row])

    cell.delegate = self

    return cell
}

extension ProductListVC: ProductListCellDelegate {
     func onTouchInfoButton(from cell: ProductListCell) {
        let selectedProduct = cell.product
        // Do your stuff here 
     }
}

ОБНОВЛЕНИЕ

Поскольку вы используете segue для навигации, давайте создадим переменную для хранения выбранного вами продукта в вашем ProductListVC

import UIKit
    import Firebase
    import FirebaseFirestore

    class ProductListVC: UIViewController {

        @IBOutlet weak var productListTableView: UITableView!

        var productInventory: [ProductList] = []
        var productSetup: [ProductList] = []
        var selectedProduct: Product?

        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
        }

        override func viewDidLoad() {
            super.viewDidLoad()

            productListTableView.dataSource = self
            productListTableView.delegate = self
            searchBar.delegate = self

            fetchProducts { (products) in
                self.productSetup = products
                self.productListTableView.reloadData()
            }

        }
       func fetchProducts(_ completion: @escaping ([ProductList]) -> Void) {
           let ref = Firestore.firestore().collection("products")
      ref.addSnapshotListener { (snapshot, error) in
                guard error == nil, let snapshot = snapshot, !snapshot.isEmpty else {
                    return
                }
                completion(snapshot.documents.compactMap( {ProductList(dictionary: $0.data())} ))
            }
        }

            override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if let vc = segue.destination as? MoreInforVC {
            vc.product = self.selectedProduct
            }
        }
    }

    extension ProductListVC: UITableViewDelegate, UITableViewDataSource {
        func numberOfSections(in tableView: UITableView) -> Int {
            return 1
        }
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

            return productSetup.count
        }

        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            guard let cell = tableView.dequeueReusableCell(withIdentifier: "ProductListCell") as?
    ProductListCell else { return UITableViewCell() }

             cell.configure(withProduct: productSetup[indexPath.row])

             cell.delegate = self

          return cell
      }

  }

  extension ProductListController: ProductListCellDelegate {
      func onTouchInfoButton(from cell: ProductListCell) {
          self.selectedProduct = cell.product
          self.performSegue(withIdentifier: "YourSegueIdentifier", sender: self)
      }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...