【问题标题】:Best Approach to make Calculation in tableviewcells and sums up in UILabel在 tableviewcells 中进行计算并在 UILabel 中总结的最佳方法
【发布时间】:2020-06-24 08:40:42
【问题描述】:

我的购物车是这样的

计算所有单元格并总结总金额标签的最佳方法应该是什么

购物车是这样工作的:

单元格项目的增量使价格标签的值加倍,但是当我将新单元格出列时,它已经具有该增量值

当尝试使用自定义委托时,Delegate 总是显示 nil

我该怎么办?为什么我的委托总是 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
    }


}

【问题讨论】:

  • 您是否将 cellDelegateFunc 设置为 CartViewController?
  • 您已经包含了与 UI 相关的代码,但进行计算不是 UI 任务,您应该在视图控制器或特定模型类中处理数据源。
  • 将代码发布到您的cellForRowAt 方法
  • 查看更新后的帖子

标签: swift xcode uitableview viewmodel


【解决方案1】:

正如@joakim 在评论中所说,您正在 UI 中进行计算!这不是正确的方法

当 UITableView 滚动时,每个单元格都会因为重用而重新加载,每个单元格都会因为再次加载而失去其状态。因此,您必须将每个单元格的状态存储在模型中,并在每次加载单元格时将其传递给您的单元格。

根据您的要求最佳方法是使用 ViewModel 或 Presenter 来存储视图的状态(这里是您的单元格),并在每次加载时提供该视图(例如在您的 cellForRow) 与存储的状态或属性

【讨论】:

  • 我知道在 Cell 类中进行计算是错误的,但问题是我不知道在模型类中为每个单独的单元格进行计算
  • @HanzalaRaza 您必须搜索将设计模式(ViewModel 或 Presenter,...)与 TableViewCell 一起使用的示例,请参阅stackoverflow.com/a/38957731/3472667
猜你喜欢
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 2010-10-08
  • 2021-12-15
  • 2015-09-26
  • 1970-01-01
相关资源
最近更新 更多