繁体   English   中英

UITableView在单击按钮时更改其图像Swift 4

[英]UITableView when click button and change its image Swift 4

单击UITableView的按钮时出现问题。

当我单击一个按钮更改其图像时,另一个索引路径更改了它的图像。

当我单击一个按钮时,两个按钮会更改其图像。

该视频显示了问题所在:

视频显示问题

这是我单击按钮的代码:

  @objc func btnAction(_ sender: UIButton) {

    let section = 0
    let row = sender.tag
    let indexPath = IndexPath(row: row, section: section)


    //let point = sender.convert(CGPoint.zero, to: servicestable as UIView)
   // let indexPath: IndexPath! = servicestable.indexPathForRow(at: point)
    let cell: ServicesCell = self.servicestable.cellForRow(at: indexPath) as! ServicesCell

        print(sender.tag)


    if  services[indexPath.row].choose == "0" {

        cell.check.setImage(UIImage(named: "Rectangle1"), for: .normal)

        services[indexPath.row].choose = "1"
      //  checkchoose.updateValue(1, forKey: indexPath.row)

        print("number: " + String(indexPath.row))

        chooseservicesw.updateValue("0", forKey: String(indexPath.row+1))


   //     servicestable.reloadData()

    }

  else  if services[indexPath.row].choose == "1" {

        cell.check.setImage(UIImage(named: "checkbox1"), for: .normal)



        services[indexPath.row].choose = "0"
      //  checkchoose.updateValue(0, forKey: indexPath.row)

        print("number: " + String(indexPath.row))

        chooseservicesw.removeValue(forKey: String(indexPath.row+1))


     //   servicestable.reloadData()

    } }

这是我给Cell的代码:

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

     let cell:ServicesCell = servicestable.dequeueReusableCell(withIdentifier: "servicess", for: indexPath) as! ServicesCell




    cell.name.text = services[indexPath.row].name

    let photo = services[indexPath.row].icon

    let imgURL = MainUrl + photo! // or jpg
  //  cell.icon.setImageFromURl(stringImageUrl: imgURL)

    let url = URL(string: imgURL)
    cell.icon.kf.setImage(with: url)

 //   print(checkchoose[indexPath.row])

    print(services[indexPath.row].choose)



    cell.check.tag = indexPath.row


    cell.check.addTarget(self, action: #selector(self.btnAction(_:)), for: .touchUpInside)

    cell.checkpay.tag = indexPath.row


    cell.checkpay.addTarget(self, action: #selector(self.btnAction2(_:)), for: .touchUpInside)
    cell.price.addTarget(self, action: #selector(self.endedit(_:)), for: .editingDidEnd)
    cell.price.addTarget(self, action: #selector(self.endedit(_:)), for: .editingChanged)



    cell.selectionStyle = .none



    return cell


}

当您执行dequeueReusableCell时,iOS不会生成阵列的单元格计数。 取而代之的是,它生成更少的单元格,并在滚动中一次又一次地使用这些单元格。 在您的情况下,所选显示的单元格实际上是相同的单元格。

解决方案:您应该将单元格的选择标志存储在数据源数组中(在本例中为service )。 cellForRowAt方法中,应根据存储的选择数据选择或取消选择复选框。

编辑:

if  services[indexPath.row].choose == "0" {
    cell.check.setImage(UIImage(named: "Rectangle1"), for: .normal)
    services[indexPath.row].choose = "1"
    chooseservicesw.updateValue("0", forKey: String(indexPath.row+1))
} else  if services[indexPath.row].choose == "1" {
    cell.check.setImage(UIImage(named: "checkbox1"), for: .normal)
    services[indexPath.row].choose = "0"
    chooseservicesw.removeValue(forKey: String(indexPath.row+1))
}

将此部分添加到cellForRowAt方法的末尾。

这个问题是因为您可以像这样处理内存中的可重用单元:

在ViewController或TableViewController中,添加处理选定模型的Array selectedIndexPathServices添加YourServiceModel

class TableViewController: UITableViewController {

    var selectedIndexPathServices :[YourServiceModel] = [YourServiceModel]()


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

在你的btnAction

  @objc func btnAction(_ sender: UIButton) {
        guard let cell = sender.superview?.superview as? ServicesCell else { return}

        let indexPath = self.tableView.indexPath(for: cell)

        if selectedIndexPathServices.contains(services[indexPath.row]){
            selectedIndexPathServices.remove(at: indexPath.row)

        }else{
            selectedIndexPathServices.append(services[indexPath.row])
        }
    }

在您的牢房:

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

        let cell:ServicesCell = servicestable.dequeueReusableCell(withIdentifier: "servicess", for: indexPath) as! ServicesCell


        cell.name.text = services[indexPath.row].name

        let photo = services[indexPath.row].icon

        let imgURL = MainUrl + photo! // or jpg
        //  cell.icon.setImageFromURl(stringImageUrl: imgURL)

        let url = URL(string: imgURL)
        cell.icon.kf.setImage(with: url)

        //   print(checkchoose[indexPath.row])



        if selectedIndexPathServices.contains(services[indexPath.row]){


            if  services[indexPath.row].choose == "0" {
                cell.check.setImage(UIImage(named: "Rectangle1"), for: .normal)
                services[indexPath.row].choose = "1"
                chooseservicesw.updateValue("0", forKey: String(indexPath.row+1))

            }

            else  if services[indexPath.row].choose == "1" {
                cell.check.setImage(UIImage(named: "checkbox1"), for: .normal)
                services[indexPath.row].choose = "0"
                chooseservicesw.removeValue(forKey: String(indexPath.row+1))
            }

        }

        cell.check.tag = indexPath.row


        cell.check.addTarget(self, action: #selector(self.btnAction(_:)), for: .touchUpInside)

        cell.checkpay.tag = indexPath.row

        cell.checkpay.addTarget(self, action: #selector(self.btnAction2(_:)), for: .touchUpInside)
        cell.price.addTarget(self, action: #selector(self.endedit(_:)), for: .editingDidEnd)
        cell.price.addTarget(self, action: #selector(self.endedit(_:)), for: .editingChanged)



        cell.selectionStyle = .none



        return cell


    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM