Лучший подход для расчета в ячейках таблицы и суммирования в UILabel - PullRequest
0 голосов
/ 12 марта 2020

Моя корзина выглядит следующим образом

enter image description here

Какой должен быть наилучший подход для расчета всех ячеек и суммирования Общая сумма метки

Корзина Работает так:

Увеличение элемента ячейки удваивает значение метки цены, но когда я удаляю новую ячейку в очередь, она уже имеет это значение приращения

При попытке для работы с пользовательским делегатом Делегат всегда показывает nil

Что мне делать? почему мой делегат всегда равен нулю?

TableViewCell

class ShoppingCartCell: UITableViewCell {


    @IBOutlet weak var cellView:UIView!
    @IBOutlet weak var productImageView:UIImageView!
    @IBOutlet weak var productName:UILabel!
    @IBOutlet weak var brandName:UILabel!
    @IBOutlet weak var productPrice:UILabel!
    @IBOutlet weak var modifier1Lbl:UILabel!
    @IBOutlet weak var modifier2Lbl:UILabel!
    @IBOutlet var counterBtns:[UIButton]!
    @IBOutlet weak var counterLbl:UILabel!


    var delegate : cellDelegateFunc?
    override func layoutMarginsDidChange() {
        super.layoutMarginsDidChange()
        contentView.frame = contentView.frame.inset(by: UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10))

        productImageView.layer.cornerRadius = productImageView.frame.height / 4
        cellView.roundUIViewWithShadow(cornerRadius: 4, shadowColor: .darkGray)
        cellView.layer.masksToBounds = false
        cellView.layer.shadowColor = UIColor.lightGray.cgColor
        cellView.layer.shadowOpacity = 1
        cellView.layer.shadowOffset = .zero

    }
    override func awakeFromNib() {
        super.awakeFromNib()

        cellView.layer.cornerRadius = cellView.frame.height / 16
        productImageView.layer.cornerRadius = productImageView.frame.height / 16
    }


    @IBAction func counter(_ sender:UIButton){

        self.delegate?.countItems(self)
    }

}

CartViewController (определенная часть)

class ShoppingBagVC: UIViewController , cellDelegateFunc {
    func countItems(_ cell: ShoppingCartCell) {
        print("print")
    }
}

протокол

protocol cellDelegateFunc : class {
    func countItems(_ cell:ShoppingCartCell)
}

CellForRow

   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if cartAllData[indexPath.row].deal.data != nil {
       let cell = cartTableView.dequeueReusableCell(withIdentifier: "cell3", for: indexPath) as! ShoppingCartDealCell
        cell.originalPrice = Int(cartAllData[indexPath.row].deal.data!.dealPrice)
        cell.productName.text = cartAllData[indexPath.row].deal.data?.dealName
        cell.productPrice.text = "Rs.\(String(cell.originalPrice))"
        cell.freeItem.text = cartAllData[indexPath.row].deal.data?.freeProduct
        cell.productImageView?.sd_setImage(with: URL(string: cartAllData[indexPath.row].deal.data!.imageURL), completed: nil)
        return cell
    } else {
         let cell = cartTableView.dequeueReusableCell(withIdentifier: "cell2", for: indexPath) as! ShoppingCartCell
        var originalPrice = Int()

                  var price : Int = 2{
                      didSet {
                          cell.productPrice.text = "Rs.\(String(price))"
                      }
                  }

                  var count : Int = 1{
                      didSet {
                          cell.counterLbl.text = String(count)
                          price = originalPrice * count
                      }
                  }



                  if let value = cartAllData[indexPath.row].deal.data?.quantity {
                      cell.counterLbl.text = String(value)
                  }
        if let value = cartAllData[indexPath.row].product.data?.quantity {
            cell.counterLbl.text = String(value)
        }
        originalPrice = Int(cartAllData[indexPath.row].product.data!.productBasePrice)
        cell.productPrice.text = "Rs.\(String(originalPrice))"
        cell.productName.text = cartAllData[indexPath.row].product.data?.productName
        cell.productImageView?.sd_setImage(with: URL(string: cartAllData[indexPath.row].product.data!.imageURL), completed: nil)
        cell.modifier1Lbl.text = cartAllData[indexPath.row].product.data?.modifier1
        cell.modifier2Lbl.text = cartAllData[indexPath.row].product.data?.modifier2
        return cell
    }


}

1 Ответ

1 голос
/ 12 марта 2020

Как сказал @joakim в комментарии, вы выполняете вычисления в пользовательском интерфейсе! и это не правильный путь

Когда прокручивается UITableView, каждая ячейка перезагружается из-за повторного использования, и каждая ячейка теряет свое состояние, потому что она загружается снова. поэтому вы должны хранить состояние каждой ячейки в модели и передавать ее в вашу ячейку каждый раз, когда ячейка загружается.

Как вы и просили Наилучшим подходом будет использование ViewModel или Presenter. хранить состояние просмотра (здесь ваша ячейка) и при каждой загрузке, которую вы передаете этому представлению (например, в cellForRow ) с сохраненными состояниями или свойствами

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