ios - TableView 选中标记和取消选中并向上滚动仍然选中 Ios Swift 4 中的单元格值

标签 ios swift uitableview

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 Scroll Down To show a Your Checkmark cell is will Removed Because cell is dequeueReusableCell So This Problem Fix , you Have just put Your code and Solved Your Problem.

Any More Help So Send Massage. Thank you So much. :)

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.
}

最佳答案

我认为如果有人运行你的代码,它不会显示任何错误。但根据真实数据,它可能会。 原因存储复选标记的方式。当您应该存储数组的实际 indexPath 时,您将行的数据存储到 temp 数组中,以便只有该行获得复选标记。在您的情况下,如果一行的标签内有 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)
    }
}

关于ios - TableView 选中标记和取消选中并向上滚动仍然选中 Ios Swift 4 中的单元格值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51906543/

相关文章:

ios - iOS 10 上的 ScrollView "bug",swift 4

ios - 特定 iOS 版本的 Swift 扩展

ios - CMVideoFormatDescriptionGetCleanAperture() 快速错误

ios - MBProgressHUD 禁用与 UITableViewController 的交互

ios - 按需显示/隐藏自定义单元格中的按钮不起作用

ios - 如何改进 Swift/Xcode iOS 应用程序中文本字段的控制语句?

ios - 如何同时模拟不同尺寸的 iPhone?

ios - 无法将图像(个人资料图片)按钮添加到 UINavigationBar

ios - 约束动画之前的跳跃图像

ios - UITableViewController 和 UIColor 滚动时改变位置