滚动tableView时无法取消选中选中标记

时间:2019-05-26 17:28:30

标签: swift uitableview

我正在尝试在tableViewCell中执行复选标记按钮。当用户点击对勾标记按钮时,对勾标记图像将被隐藏/显示。我现在面临的问题是,当我滚动表格视图时,复选标记按钮作用异常,需要双击以取消选中复选标记。

当我不滚动tableView时,效果很好。以下是视频和代码。预先感谢。

https://youtu.be/cQBIuIXJlRY

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

    let cell = tableView.dequeueReusableCell(withIdentifier: "dtvc") as! DeviceTableViewCell

    let scannedDevice = devices[indexPath.row]

    // Set the tag & addTarget for addButton
    cell.addButton.addTarget(self, action: #selector(addButtonTapped), for: .touchUpInside)
    cell.addButton.isEnabled = true
    cell.addButton.tag = indexPath.row

    cell.configureCell(with: scannedDevice)
    cell.isSelected = checked[indexPath.row] ?? false
    print("cell isSelected at \(indexPath.row) cellForRow \(cell.isSelected)")
    print("checked value at \(indexPath.row) is \(checked[indexPath.row])")

    if checked[indexPath.row] == true {
        cell.deviceMake.textColor = UIColor.white
        cell.backgroundColor = UIColor(red: 233/255, green: 72/255, blue: 85/255, alpha: 1)
        cell.addButton.setImage(UIImage(named: "Checkmark"), for: .normal)
        cell.addButton.bgColor = UIColor.green

    } else {
        cell.deviceMake.textColor = UIColor.gray
        cell.backgroundColor = UIColor.clear
        cell.addButton.setImage(nil, for: .normal)
        cell.addButton.bgColor = UIColor(red: 233/255, green: 72/255, blue: 85/255, alpha: 1)
    }

    return cell

}


@objc func addButtonTapped(_ sender: UIButton) {

    let indexPath = IndexPath(row: sender.tag, section: 0)
    let scannedDevice = devices[sender.tag]

    let cell = tableView.cellForRow(at: indexPath) as! DeviceTableViewCell
    cell.isSelected = !cell.isSelected

    print("cell.isSelected is at button \(sender.tag) tapped is \(cell.isSelected)")

    if cell.isSelected == true {
    // Main color RGB is  233,72,85 ... hex is E94855
        cell.deviceMake.textColor = UIColor.white
        cell.backgroundColor = UIColor(red: 233/255, green: 72/255, blue: 85/255, alpha: 1)
        cell.addButton.setImage(UIImage(named: "Checkmark"), for: .normal)
        cell.addButton.bgColor = UIColor.green
        checked[sender.tag] = cell.isSelected
        print("Checked 1 at tag \(sender.tag) is \(checked[sender.tag])")

        //show selectedDeviceView
        if selectedDeviceView.isHidden {
            UIView.animate(withDuration: 2.5, delay: 0.7, options: .curveEaseInOut, animations: {
                self.tableViewHeightConstraint.constant = self.tableViewHeightConstraint.constant - self.selectedDeviceViewTopConstraint.constant - self.selectedDeviceView.frame.height
                self.selectedDeviceViewTopConstraint.constant = 0
                self.selectedDeviceView.isHidden = false
            }, completion: nil)
        }

    }
    else {
        cell.deviceMake.textColor = UIColor.gray
        cell.backgroundColor = UIColor.clear
        cell.addButton.setImage(nil, for: .normal)
        cell.addButton.bgColor = UIColor(red: 233/255, green: 72/255, blue: 85/255, alpha: 1)
        checked[sender.tag] = cell.isSelected
        print("Checked 2 at tag \(sender.tag) is \(checked[sender.tag])")


    }

}

1 个答案:

答案 0 :(得分:0)

首先将所选状态放入设备类/结构中,而不要使用额外的数组

class Device {
    var isSelected = false

...

第二个人不以视图的观点进行思考。这意味着在模型中切换isSelected并重新加载该行。好处是视图只能在cellForRow中可靠地操作。

例如

@objc func addButtonTapped(_ sender: UIButton) {

    let indexPath = IndexPath(row: sender.tag, section: 0)
    devices[indexPath.row].isSelected.toggle()
    self.tableView.reloadRows(at: [indexPath], with: .none)
    if devices[indexPath.row].isSelected && selectedDeviceView.isHidden {
        UIView.animate(withDuration: 2.5, delay: 0.7, options: .curveEaseInOut, animations: {
            self.tableViewHeightConstraint.constant = self.tableViewHeightConstraint.constant - self.selectedDeviceViewTopConstraint.constant - self.selectedDeviceView.frame.height
            self.selectedDeviceViewTopConstraint.constant = 0
            self.selectedDeviceView.isHidden = false
        }, completion: nil)
    }
}

cellForRow中进行更改

cell.isSelected = scannedDevice.isSelected