为什么我的Tableview重用了一些单元格?

时间:2016-10-01 02:05:49

标签: ios swift uitableview

我有一个Todo列表,我在同一个单元格中有一个标签和一个按钮,当我单击该按钮时,更改该单元格的图像按钮,但是当我滚动表格视图时,其他单元格上会出现相同的按钮,它不会出现在按钮没有被按下的单元格中。

这是我的cellForRowAtIndexPath代码

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("cell") as! TaskTableViewCell


    cell.label.text = "Task Number: \(indexPath.row + 1)"
    cell.btnFavorite.setImage(UIImage(named: "star"), forState: .Normal)
    cell.btnFavorite.setImage(UIImage(named: "star-filled"), forState: .Selected)
    cell.btnFavorite.addTarget(self, action: #selector(ListOfTasksViewController.addRemoveFavoriteList), forControlEvents: .TouchUpInside)


    return cell
}

func addRemoveFavoriteList(sender : UIButton) {
    sender.selected = !sender.selected

}

自定义TableViewCell类:

 import UIKit

class TaskTableViewCell: UITableViewCell {

    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var btnFavorite: FavoriteButton!

    override func awakeFromNib() {
        super.awakeFromNib()

    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

    }

    override func prepareForReuse() {
        super.prepareForReuse()
        label.text = nil
        btnFavorite.selected = false

    }

}

查看控制器:

import UIKit

class ListOfTasksViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self

    }

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 20
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCellWithIdentifier("cell") as! TaskTableViewCell


        cell.label.text = "Task Number: \(indexPath.row + 1)"

        cell.btnFavorite.indexPath = indexPath.row

        cell.btnFavorite.addTarget(self, action: #selector(ListOfTasksViewController.addRemoveFavoriteList), forControlEvents: .TouchUpInside)


        return cell
    }

    func addRemoveFavoriteList(sender : FavoriteButton) {

        if sender.selected {
            sender.selected = false


        } else {
            sender.selected = true

            let index = NSIndexPath(forRow: sender.indexPath, inSection: 0)
            let cell = tableView.cellForRowAtIndexPath(index) as! TaskTableViewCell


        }

    }




}

2 个答案:

答案 0 :(得分:2)

表格视图中的单元格将被重复使用,因此当您向下滚动时,屏幕上的单元格将被放置在队列的开头,然后返回到不同indexPath的屏幕上。这可能会导致一些问题,因此您需要覆盖自定义单元格类中的prepareForReuse方法。

override func prepareForReuse() {

    super.prepareForReuse()

    label.text = nil
    btnFavorite.selected = false
}

答案 1 :(得分:0)

您需要在cellforaRowAtIndexPath中添加条件。

您需要在Array中添加标记以跟踪您的选择。 然后检查cellforRowAtIndexPath。

例如

button.selected= No

if arrselectedIndexpath containObject:indexPath{
button.selected =yes
}