Как передать данные из кнопки в виде таблицы для просмотра контроллера с помощью Firestore? - PullRequest
0 голосов
/ 29 сентября 2019

Мне нужно получить информационную кнопку , чтобы представить описание продукта из контроллера просмотра таблиц в всплывающее представление контроллера путем передачи данных из моей базы данных Cloud Firestore.

как бы я мог передавать данные из отдельной ячейки табличного представления через информационную кнопку на контроллер ItemInfo.

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

Где я хочу, чтобы вы нажимали кнопку moreInfo в ячейке табличного представления, и она сразу же переносит вас и передает данные в следующий контроллер представления.

У меня для моего табличного просмотра установлено значение "нет выбора"в раскадровке и хотите передавать данные только через MoreInfoButton в ячейках табличного представления (ProductListCell) в MoreInfoController, где вы видите Название продукта, рейтинг и краткое описание.

  import UIKit
  import Firebase
  import FirebaseFirestore

  class ProductListController: 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 ProductListController: 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])

          return cell
      }

  }

 import UIKit
 import Firebase

 class ItemInfoController: UIViewController {

      var products: ProductList!

      @IBOutlet weak var productName: UILabel!
      @IBOutlet weak var productDescription: UILabel!
      @IBOutlet weak var totalRatings: UILabel!

      override func viewDidLoad() {
          super.viewDidLoad()

         // Do any additional setup after loading the view.

         productName.text = "\(products.brand): \(products.name)"
         shortDecription.text = products.description
         totalRating.text = products.totalRating
     }

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

1 Ответ

0 голосов
/ 29 сентября 2019

это очень просто сделать, давайте сделаем это.

вы должны написать @IBOutlet для infoButton в вашем ProductListCell и связать его с вашим infoButton в представлении вашей ячейки.затем в func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell установите Tag для infoButton с помощью index.row.

. Последний шаг: создайте IBAction для infoButton в вашем классе ProductListController, а затем получите текущий Product для нажатой кнопки.

     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.infoButton.tag = indexPath.row
         return cell
     }

 }
   @IBAction func infoButtonAction(_ sender: Any) {
       let index = (sender as! UIButton).tag
       let product = productSetup[index]
   }
...