Как я могу остановить UITableView Cell от запуска определенного кода при воссоздании ячеек? - PullRequest
0 голосов
/ 28 октября 2019

У меня есть View Controller с UITableView, который используется в качестве «корзины» для сбора предметов. Ячейки используются, чтобы принять заказ пользователя и рассчитать общую стоимость заказа. Пользователь выбирает товар и количество, а затем добавляет его в корзину. Затем товар добавляется в «корзину». Общее количество каждого элемента добавляется в глобальный массив, а затем общее значение этого массива добавляется в глобальную переменную.

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

Мне нужен способ расчета количества товара * для каждой ячейки. И каким-то образом обновите общую стоимость всех предметов соответственно.

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

    //converting quantity INT into String for the label text
    let quantityString = String(basketQuantityGlobal[indexPath.row])

    let quantityInt = basketQuantityGlobal[indexPath.row]
    let itemPriceFloat : Float = getItemPriceGlobalArray[indexPath.row]

    //calculating total for that item * quantity
    let totalItemsCost = Float(quantityInt) * itemPriceFloat

    cell.itemTitleLabel.text = productNameGlobal[indexPath.row]
    cell.quantityLabel.text = quantityString
    cell.itemPriceLabel.text = String(format: "%.2f", totalItemsCost)

    //below collects all the totals so we can get the final total for all orders
    getTotalGlobalArray.append(totalItemsCost)

    // total bill (calculates total of all values in array)
    totalCostOfOrder = getTotalGlobalArray.reduce(0, +)

    //populates 'total' label accordingly
    totalLabel.text = String(format: "%.2f", totalCostOfOrder)

    return cell
}

1 Ответ

0 голосов
/ 28 октября 2019

Вам необходимо разделить код пользовательского интерфейса и код модели данных. Я бы сделал что-то вроде создания объекта корзины, который содержит массив объектов продажи и предоставляет методы для таких операций, как добавление продажи, вычисление итогов, возврат информации для вашего tableView. Примерно так (пример, чтобы дать вам идею - не фактический скомпилированный код)

struct Basket{
  struct Sale {
    item: ItemType //be that a part number, name String, or whatever
    quantity: Int
    itemCost: Float
    value: Float {return itemCost * Float(quantity)}
  }

  private var _totalValue: Float
  private var basketItems: [Sale] = [] {
    didSet { 
      _totalValue = basketItems.reduce(0){$0 + $1.value}
    }
  }

  internal var totalValue: String {return String(format: "%.2f", _totalValue)}

  internal func addSale(item: ItemType, quantity: Int, price: Float {
    basketItems.append(Sale(item: item, quantity: quantity, itemCost: price))
  }

  internal func tableViewData(for row: Int) -> (name:String, quantity: String, Cost: String){
    let sale = basketItems[row]
    //sale items formatted as string as you wish, then return them in a tuple
    return (s1, s2 s3) 
  }

И тогда вы можете просто создать Basket, как глобальную переменную, если вам это необходимо, хотя это не лучшая практика, и использоватьвидимые свойства / методы для добавления продаж или заполнения tableView, зная, что значения, которые вы получаете, будут надежными.

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

  let cellStrings = basket.tableViewData(for: indexPath.row)
  cell.itemTitleLabel.text = cellStrings.0
  cell.quantityLabel.text = cellStrings.1
  cell.itemPriceLabel.text = cellStrings.2
  totalLabel.text = basket.totalValue
  return cell
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...