TableView CheckMark and Uncheck With Scroll Up Still Checked Cell Value In Ios Swift 4

后端 未结 2 1314
野的像风
野的像风 2020-12-12 01:22

TableView CheckMark Cell Value Removed After Scrolling Up It will Fix TableView in You have face a problem many times to Checkmark after scroll Up then Scro

相关标签:
2条回答
  • 2020-12-12 01:48

    I think if someone were to run your code it would not show any error. But with real data it probably will. The reason is the way you store your checkmarks. You store the data of a row into the temp array when you should be storing the actualy indexPath of the array so that only that row gets the checkmark. In your case, if a row has 1 inside it's label and you click on it, that cell will be highlighted. Now if you start scrolling and another cell contains 1 then that row will also be highlighted.

    I have modified your example for the case of a single section. If there is more than one section, you need to store the indexPath instead of indexPath.row.

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCell(withIdentifier: "id")
        cell = UITableViewCell.init(style: .default, reuseIdentifier: "id")
        cell?.textLabel?.text = String(numarr[indexPath.row])
        if temp.contains(indexPath.row) {
            cell?.accessoryType = .checkmark
        } else {
            cell?.accessoryType = .none
        }
        return cell!
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    
        let cell = tableView.cellForRow(at: indexPath)
        if temp.contains(indexPath.row) {
            cell?.accessoryType = .none
            temp.remove(at: indexPath.row)
        } else {
            cell?.accessoryType = .checkmark
            temp.append(indexPath.row)
        }
    }
    
    0 讨论(0)
  • 2020-12-12 01:51

    You are strongly discouraged from using a second array to keep the selected state.

    This is Swift, an object oriented language. Use a custom struct for both num and the selected state.
    In didSelectRowAt and didDeselectRowAt change the value of isSelected and reload the row.

    And use always the dequeueReusableCell API which returns a non-optional cell.

    struct Item {
       let num : Int
       var isSelected : Bool
    }
    
    var numarr = [Item]()
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return numarr.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "id", for: indexPath)
        let item = numarr[indexPath.row]
        cell.textLabel?.text = String(item)
        cell.accessoryType = item.isSelected ? .checkmark : .none
        return cell
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        updateSelection(at: indexPath, value : true)
    }
    
    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        updateSelection(at: indexPath, value : false)
    }
    
    func updateSelection(at indexPath: IndexPath, value : Bool) {
        let item = numarr[indexPath.row]
        item.isSelected = value
        tableView.reloadRows(at: [indexPath], with: .none)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        (0...100).map{Item(num: $0, isSelected: false)}
    }
    
    0 讨论(0)
提交回复
热议问题