Передача данных из кнопки в ячейке в другую таблицу? - PullRequest
2 голосов
/ 07 ноября 2019

как передать данные с кнопки в представлении таблицы меню в представление таблицы корзины? Могу ли я использовать его, использовать замыкания, протокол / делегаты, что-то еще?

У меня проблемы с передачей данных из моей кнопки AddtoCart в моем MenuViewController в CartViewController

, цель состоит в том, чтобы поместить элементы в CartVCпри нажатии кнопки ATC в MenuCell

Кнопка CartB на NavBar в MenuVC переходит к CartVC при нажатии

Кнопка ATC в ячейке передает все данные выбранных ячеек в cartVC(изображение, имя, категория, вес и цена)

Я использую Cloud Firestore для публикации данных, чтобы заполнить свои ячейки VC

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

TBV2TBV

import UIKit
import SDWebImage
import Firebase


class MenuCell: UITableViewCell {

    weak var items: Items!

    @IBOutlet weak var name: UILabel!
    @IBOutlet weak var category: UILabel!
    @IBOutlet weak var productImage: UIImageView!

    @IBOutlet weak var weight: UILabel!
    @IBOutlet weak var price: UILabel!

    @IBOutlet weak var addToCart: RoundButton!

    func configure(withItems items: Items) {
        name.text = items.name
        category.text = items.category
        image.sd_setImage(with: URL(string: items.image))
        price.text = items.price
        weight.text = items.weight
        self.items = items
    }
}

import UIKit
import Firebase
import FirebaseFirestore

class MenuViewController: UITableViewController {

    @IBOutlet weak var cartButton: BarButtonItem!!
    @IBOutlet weak var tableView: UITableView!
    var itemSetup: [Items] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableview.datasource = self
        fetchItems { (items) in
            self.itemSetup = items.sorted
            self.tableView.reloadData()
        }

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

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let vc = segue.destination as? CartViewController {
            vc.items = self.itemSetup
        }
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return itemSetup.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "MenuCell") as? MenuCell else { return UITableViewCell() }
        cell.configure(withItem: itemSetup[indexPath.row])
        return cell
    }
}

class TestCartViewController: UIViewController {

    var items: Items!
    @IBOutlet weak var cartTableView: UITableView!

     override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        cartTableView.dataSource = self
        cartTableView.delegate = self
    }

}

extension CartViewController: UITableViewDataSource, UITableViewDelegate {

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

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return Cart.currentCart.cartItems.count
    }

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

        let cart = Cart.currentCart.CartItems[indexPath.row]
        cell.lblWeight.text = cart.items.weight         
        cell.lblMealName.text = "\(cart.items.category): \(cart.items.name)"
        cell.lblSubTotal.text = "$\(cart.items.price)"  
        cell.imageUrl                                // can't figure out how to pass image

        return cell
    }
}

class CartCell: UITableViewCell {

    @IBOutlet weak var lblMealName: UILabel!
    @IBOutlet weak var imageUrl: UIImageView!
    @IBOutlet weak var lblSubTotal: UILabel!
    @IBOutlet weak var lblWeight: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }


}

import Foundation

class CartItem {

    var items: Items

    init(items: Items) {
        self.items = items
    }
}

class Cart {
    static let currentCart = Cart()
    var cartItems = [CartItem]()
}

1 Ответ

1 голос
/ 07 ноября 2019

Первое, что я хотел бы сделать, это избавиться от CartItem - похоже, он ничего не делает, кроме как обёртывает экземпляр Items, и у вас есть некоторая путаница в вашем коде относительно того, используете ли вы CartItem или Items (я бы, вероятно, также переименовал Items в Item - единственное число).

class Cart {
    static let currentCart = Cart()
    var cartItems = [Items]()
}

Чтобы получить действие "добавить в корзину" из своей ячейки, вы можете использовать шаблон делегирования илиобеспечить закрытие для обработки действия. Я буду использовать замыкание

class MenuCell: UITableViewCell {

    @IBOutlet weak var name: UILabel!
    @IBOutlet weak var category: UILabel!
    @IBOutlet weak var productImage: UIImageView!

    @IBOutlet weak var weight: UILabel!
    @IBOutlet weak var price: UILabel!

    @IBOutlet weak var addToCart: RoundButton!

    var addActionHandler: (() -> Void)?

    func configure(withItems items: Items) {
        name.text = items.name
        category.text = items.category
        image.sd_setImage(with: URL(string: items.image))
        price.text = items.price
        weight.text = items.weight
    }

    @IBAction func addTapped(_ sender: UIButton) {
        self.addActionHandler?()
    }

}

Теперь в вашем меню cellForRowAt вы можете предоставить обработчик действий:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "MenuCell") as! MenuCell // Just crash at this point if there isn't a valid cell identifier configured
    let item = itemSetup[indexPath.row]
    cell.configure(withItem: item)
    cell.addActionHandler = {
        Cart.currentCart.items.append(item)
    }
    return cell
}

И это должно быть все, что вам нужно сделать - когда выперейдите к контроллеру просмотра корзины, он покажет текущее содержимое корзины.

Обратите внимание, что вы можете несколько улучшить модель данных корзины, предоставив ей количество для каждого товара и предоставив функцию add(item:)который увеличил количество, если товар был в корзине

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...