一尘不染

IOS Swift 4中的TableView CheckMark和Uncheck With滚动仍选中的单元格值

swift

向上滚动后删除TableView
CheckMark单元格值将修复TableView,向上滚动然后向下滚动后,您将多次遇到Checkmark的问题,将显示Checkmark单元格将被删除,因为单元格为dequeueReusableCell,因此,此问题解决方法是您刚将您的代码并解决了您的问题。

任何其他帮助,请发送按摩。非常感谢。:)

class ViewController: UIViewController , UITableViewDataSource , UITableViewDelegate{

var temp = [Int]()
var numarr = [Int]()

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return numarr.count
}

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(numarr[indexPath.row] as Int)
    {
        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(numarr[indexPath.row] as Int)
    {
        cell?.accessoryType = .none
        temp.remove(at: temp.index(of: numarr[indexPath.row])!)
    }
    else
    {
        cell?.accessoryType = .checkmark
        temp.append(self.numarr[indexPath.row] as Int)
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    for i in 1...100
    {
        numarr.append(i)
    }
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

阅读 264

收藏
2020-07-07

共1个答案

一尘不染

我认为,如果有人要运行您的代码,则不会显示任何错误。但是如果有真实数据,它可能会。的 原因存储您的选中标记方式
。您temp应该在存储数组的实际值时将一行的数据存储indexPath到数组中,以便 只有该行才具有选中标记
。在您的情况下,如果一行1内有标签,然后单击它,则该单元格将突出显示。现在,如果您开始滚动并且包含另一个单元格,1则该行也将突出显示。

对于单节,我已经修改了您的示例。如果有多个部分,则需要存储indexPath而不是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)
    }
}
2020-07-07