如何在滚动时更新UITableView数据

时间:2018-05-25 05:31:34

标签: ios swift uitableview

我已在UITableView中显示数据。该列表适用于购物车列表中的添加购物车商品。

enter image description here

根据这张图片可以看到以下细节: -

  1. 产品名称
  2. 步进器添加数量
  3. 总金额
  4. 所以首先我在UITableView添加了产品。然后步进动作增加或减少数量,我给出了代码。

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    
            let identifier = "cell"
            var cell: ChartCell! = tableView.dequeueReusableCell(withIdentifier: identifier) as? ChartCell
    
            if cell == nil {
                tableView.register(UINib(nibName: "ChartCell", bundle: nil), forCellReuseIdentifier: identifier)
                cell = tableView.dequeueReusableCell(withIdentifier: identifier) as? ChartCell
            }
    
    
         cell.setEventData(carts: chartViewModel.datafordisplay(atindex: indexPath))
    
        cell.cartadd = { [weak self] in
    
            if let i = self?.tableView.indexPath(for: $0) {
    
                let productid = self?.chartViewModel.datafordisplay(atindex: indexPath)
                print(productid?.cartid)
    
                self?.chartViewModel.search(idsearch:productid?.cartid)
                print(self?.chartViewModel.searchindex(objectatindex: 0))
                cell.setcartData(cartsadd: (self?.chartViewModel.searchindex(objectatindex:0))!)
                print(cell.quantity)
    
                self?.chartViewModel.totalPriceInCart()
                let theIntegerValue1 :[Int] =  (self?.chartViewModel.totalvalue)!
                let result = "\(theIntegerValue1[0])"
                print(result)
                let theStringValue1 :String = String(describing: result)
                print(theStringValue1)
    
                self?.totalresult.text = theStringValue1
                print(i)
    
            }
        }
    

    viewmodel: -

    class ChartViewModel: NSObject {
    
    
        var datasourceModel:ChartDataSourceModel
    
         var totalvalue:[Int] = []
        var insertedArray:CartModel? 
    
        var filteredListArray:Array<CartModel>? = []
        var productArray:CartModel?
    
         var finalListArray:Array<CartModel>? = []
    
        init(withdatasource  newDatasourceModel: ChartDataSourceModel) {
            datasourceModel = newDatasourceModel
            print(datasourceModel.dataListArray)
    
        }
        func search(idsearch :String?) {
    
            filteredListArray = datasourceModel.dataListArray?.filter{($0.cartid?.range(of: idsearch!, options: .caseInsensitive) != nil)}
            print(filteredListArray)
    
    
        }
    
    
        func searchindex(objectatindex index: Int) ->  CartModel {
    
            return self.filteredListArray![index]
    
        }
    
    
    
        func datafordisplay(atindex indexPath: IndexPath) -> CartModel{
    
                 return  datasourceModel.dataListArray![indexPath.row]
    
    
        }
    
        func numberOfRowsInSection(section:Int) -> Int {
    
                return datasourceModel.dataListArray!.count
    
    
        }
    
        func delete(atIndex indexPath: IndexPath) {
    
            datasourceModel.dataListArray!.remove(at: indexPath.row)
             print(datasourceModel.dataListArray)
    
        }
    
        func totalPriceInCart() {
    
    
    
    
            var totalPrice: Int = 0
            for product in datasourceModel.dataListArray! {
    
                totalPrice += product.cartsumint!
    
                print(totalPrice)
    
    
            }
            self.totalvalue = [totalPrice]
    
       }
    
    
    
        func insert(atIndex indexPath: IndexPath) {
            print(productArray)
            print(datasourceModel.dataListArray)
            datasourceModel.dataListArray!.insert(productArray!, at: indexPath.row)
            print(datasourceModel.dataListArray)
            self.datasourceModel.dataListArray = datasourceModel.dataListArray
            print(datasourceModel.dataListArray)
            self.finalListArray =   self.datasourceModel.dataListArray
        }
    
          func add()  {
    
                datasourceModel.dataListArray?.append(insertedArray!)
                print(datasourceModel.dataListArray)
                print(insertedArray?.offerAddName)
                print(insertedArray?.offerprice)
    
                self.datasourceModel.dataListArray = datasourceModel.dataListArray
    
                print(insertedArray?.cartsum)
    
        }
    
     }
    

    以上代码是添加数量。此代码在UITableView cellForRowAt委托中提供。 但问题是: -

    - 当我添加产品数量时,价格也会发生变化并显示在UITableView中。但滚动UITableView时,数据会像以前一样显示。这意味着: -

    初步假设: - 产品名称:汽车,价格:300,数量:1

    这将显示在UITableView。当我添加数量:2,所以价格:600这将显示在UITableView。 但问题是在滚动UITableView时它变为价格:300,数量:1。 那么如何更新UITableView。应该做什么

    UITableviewCell: -

     func setEventData(carts:QM_CartModel)
        {
    
    
    
            self.name.text = carts.cartname
    
            self.price.text = carts.carttotalprice
    
    
            self.itemQuantityStepper.value = 1
    
            setItemQuantity(quantity)
    
    
    
            print(self.price.text)
    
    
            let value = carts.cartsum
    
    
    
            let x: Int? = Int(value!)
            print(x)
    
    
            let add = x!
            print(add)
    
    
            let theIntegerValue1 :Int =  add
            let theStringValue1 :String = String(theIntegerValue1)
            // self.price.text = theStringValue1
    
            self.price.text = "QR \(theStringValue1)"
            print(self.price.text)
    
    
        }
    
    
        func setcartData(cartsadd:QM_CartModel)
        {
    
            let theIntegerValue :Int =  self.quantity
            let theStringValue :String = String(theIntegerValue)
            cartsadd.cartquantity  = theStringValue
            print(cartsadd.cartquantity)
            print(cartsadd.cartsum)
    
            let value = cartsadd.cartsum
            let qty = cartsadd.cartquantity
    
            let x: Int? = Int(value!)
            print(x)
            let y: Int? = Int(qty!)
            print(y)
    
    
            let add = x! * y!
            print(add)
    
    
            let theIntegerValue1 :Int =  add
            let theStringValue1 :String = String(theIntegerValue1)
           // self.price.text = theStringValue1
    
    
            self.price.text = "QR \(theStringValue1)"
            print(self.price.text)
    
    
            cartsadd.cartsumint = theIntegerValue1
          //  print(cartsadd.cartsum)
    
        }
    

2 个答案:

答案 0 :(得分:1)

你需要在你的模型类中存储你的数据(更新)。因为滚动tableview dequeuereusablecell再次调用它会从模型中获取数据,这就是你总是得到旧数据的原因。

答案 1 :(得分:0)

class TableViewCellData {

    var data: Any?
}

-

class TableViewCell: UITableViewCell {

    var cellData: TableViewCellData?
    {
        didSet {
            // change data in cell from TableViewCellData
        }
    }

    var cartadd: (() -> Void)?
}

-

class ViewController: UITableViewController {

    var dataSource: [TableViewCellData] = []

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

        let cell = tableView.dequeueReusableCell(withIdentifier: "identifier", for: indexPath) as! TableViewCell
        cell.cellData = dataSource[indexPath.row]
        cell.cartadd = {
            cell.cellData?.data = "" // set data to TableViewCellData
        }
        return cell
    }
}