Как удалить строку в UITableView и обновить метку из TableViewCell - PullRequest
0 голосов
/ 03 июля 2018

У меня есть ситуация, когда я удаляю продукт из TableView, используя функцию commit editingStyle, и цена не обновляется мгновенно, потому что моя Метка находится в TableViewCell, который исключен из функции CellForRowAt. Поэтому мне нужно как-то сделать так, чтобы цена обновлялась мгновенно.

Вот мой код:

class ProductsViewController: UIViewController{

    var selectedProductsArray = [Product]()
    var priceForSelectedProductsArray = [Float]()

    // Func which will add the product into an array of products when the user press Add To Cart
    func didTapAddToCart(_ cell: ProductTableViewCell) {
        let indexPath = self.productsTableView.indexPath(for: cell)

        addProduct(at: indexPath!)
        selectedProductsArray.append(productsArray[(indexPath?.row)!]) // Append products for cart
        priceForSelectedProductsArray.append(productsArray[(indexPath?.row)!].price) // Append prices for selected products
    }
}


class CartViewController: UIViewController {

    var productsInCartArray = [Product]()
    var productPricesArray = [Float]()
    var totalSum: Float?

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

        fetchSelectedProducts()
    }

    // Append the selectedProducts into productsInCartArray using the TabBarController
    func fetchSelectedProducts() {

        productsInCartArray = ((self.tabBarController?.viewControllers![0] as! UINavigationController).viewControllers[0] as! ProductsViewController).selectedProductsArray
        productPricesArray = ((self.tabBarController?.viewControllers![0] as! UINavigationController).viewControllers[0] as! ProductsViewController).priceForSelectedProductsArray
        totalSum = productPricesArray.reduce(0, +)
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = cartTableView.dequeueReusableCell(withIdentifier: Constants.identifierCartTotalPriceCell, for: indexPath) as! CartTableViewCell

        if let finalPrice = totalSum, finalPrice > 0 {
            cell.cartTotalPriceLabel.text = String(format: Constants.floatTwoDecimals, finalPrice) + Constants.currencyPound
        }
        else{
            cell.cartTotalPriceLabel.text = String(0.00) + Constants.currencyPound
        }

        return cell
    }


    // Function to delete a product from the cart
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete {

            // TO DO: update the price Instantly when I delete a product
            ((self.tabBarController?.viewControllers![0] as! UINavigationController).viewControllers[0] as! ProductsViewController).selectedProductsArray.remove(at: indexPath.row)
            ((self.tabBarController?.viewControllers![0] as! UINavigationController).viewControllers[0] as! ProductsViewController).priceForSelectedProductsArray.remove(at: indexPath.row)

            totalSum = productPricesArray.reduce(0, +)
            // here I need to access the `cartTotalPriceLabel.text` to be equal with `totalSum`

            productsInCartArray.remove(at: indexPath.row)
            cartTableView.deleteRows(at: [indexPath], with: .fade)
            cartTableView.reloadData()

        }
    }
}

А вот и фото:

enter image description here

Спасибо за ваше время, если вы читаете это, и я желаю вам хорошего дня!

1 Ответ

0 голосов
/ 04 июля 2018

Просто вызовите функцию "fetchSelectedProducts()" перед перезагрузкой таблицы . Таким образом, вы получите Обновленная общая сумма.

поэтому удаление товара из функции корзины будет выглядеть так:

// Функция удаления товара из корзины

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {

        // TO DO: update the price Instantly when I delete a product
        ((self.tabBarController?.viewControllers![0] as! UINavigationController).viewControllers[0] as! ProductsViewController).selectedProductsArray.remove(at: indexPath.row)
        ((self.tabBarController?.viewControllers![0] as! UINavigationController).viewControllers[0] as! ProductsViewController).priceForSelectedProductsArray.remove(at: indexPath.row)

        totalSum = productPricesArray.reduce(0, +)
        // here I need to access the `cartTotalPriceLabel.text` to be equal with `totalSum`

        productsInCartArray.remove(at: indexPath.row)
        cartTableView.deleteRows(at: [indexPath], with: .fade)
        fetchSelectedProducts()
        cartTableView.reloadData()

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