重用单元格效果不佳 - TableView

时间:2016-10-14 18:12:20

标签: ios swift uitableview uibutton tableviewcell

我的手机按钮有问题。 在我的tableView中,每一行由以下内容组成:图像,一些标签和一个按钮。 该按钮具有复选标记图像。单击时,按钮的图像会发生变化。 问题是另一个按钮的图像也没有理由地改变。 发生这种错误是因为我的细胞被重复使用。

我曾尝试在TableViewCell中使用prepareForReuse方法,但没有任何反应。我也试过selectedRowAt,但我没有任何结果。请帮帮我。

图片1:

Image 1

图片2:

Image 2

这是我在custom Cell:

中的功能
  override func prepareForReuse() {
    if checkStr == "uncheck"{
        self.checkBook.setImage(uncheck, for: .normal)
    } else if checkStr == "check"{
        self.checkBook.setImage(check, for: .normal)
    }
}

func isPressed(){
    let uncheck = UIImage(named:"uncheck")
    let check = UIImage(named: "check")
    if self.checkBook.currentImage == uncheck{
        checkStr == "check"
    } else self.checkBook.currentImage == check{
        checkStr == "uncheck"
    }
}

在我的tableView

  override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let selectedCell: ListPropertyUserCell = tableView.cellForRow(at: indexPath) as! ListPropertyUserCell
    let uncheck = UIImage(named:"uncheck")
    let check = UIImage(named: "check")
    if selectedCell.checkBook.imageView?.image == uncheck{
        selectedCell.checkStr = "check"
    } else if selectedCell.checkBook.imageView?.image == check{
        selectedCell.checkStr = "uncheck"
    }
}

6 个答案:

答案 0 :(得分:1)

根据帖子中的信息,这看起来像是细胞重用问题。问题是tableView重用单元格而不是创建新单元格来保持性能。如果您还没有重置单元格的状态,则重用的单元格将保持配置为旧状态。

要快速解决问题,您可以在prepareForReuse上实施UITableViewCell方法。

但是,您需要存储哪个单元格已经过检查'如果要在滚动tableView后选中复选框,请在视图控制器中。您可以自己存储,也可以使用tableView的didSelectRowAtIndexPath方法。

答案 1 :(得分:0)

尝试这样做:

var checkBook = UIImageView()

if self.checkBook.image == UIImage(named: "check"){
   self.checkBook.image = UIImage(named: "uncheck")
}
else{
   self.checkBook.image = UIImage(named: "check")
}

答案 2 :(得分:0)

UITableViewCell可重用。您无法在单元格中存储视图状态。您应该在

中设置单元格
func tableView(UITableView, cellForRowAt: IndexPath)  

数据源的方法

实现这一目标的最简单方法是实施

func tableView(UITableView, didSelectRowAt: IndexPath) 
func tableView(UITableView, didDeselectRowAt: IndexPath)

UITableViewDelegate的方法

然后,您可以在这些方法和cellForRowAtIndexPath设置单元格中为某些数组添加/删除indexPath。

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

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

        if array.contains(indexPath) {
         cell.checkBook.image = UIImage(named: "check")
        } else {
         cell.checkBook.image = UIImage(named: "uncheck")
        }

        return cell
}  

答案 3 :(得分:0)

如果您正在使用整个单元格上的点击,则可以覆盖自定义单元格中的setSelected func。

override func setSelected(selected: Bool, animated: Bool) {
     super.setSelected(selected, animated: animated)
     if selected {
         self.checkBook.image = UIImage(named: "check")
     } else {
         self.checkBook.image = UIImage(named: "uncheck")
    }
}

答案 4 :(得分:0)

试试我的代码。这里selectindex用于获取选定的单元格索引,selectedindex是NSMutableArray,用于存储所有选定的单元格值。

var selectindex : Int?
var selectedindex : NSMutableArray = NSMutableArray()
@IBOutlet var tableview: UITableView!

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

     let cell = tableView.dequeueReusableCellWithIdentifier("LikeCell", forIndexPath: indexPath)
     let like: UIButton = (cell.viewWithTag(2) as! UIButton)// like button
     let comment: UIButton = (cell.viewWithTag(3) as! UIButton) // comment button
     comment.setBackgroundImage(UIImage(named: "chat.png"), forState: UIControlState.Normal) // comment button set
     like.addTarget(self, action: #selector(self.CloseMethod(_:event:)), forControlEvents: .TouchDown)
     comment.addTarget(self, action: #selector(self.CloseMethod1(_:event:)), forControlEvents: .TouchDown)

     return cell
}


// This is my like button action method.
@IBAction func CloseMethod(sender: UIButton, event: AnyObject) {

        let touches = event.allTouches()!
        let touch = touches.first!
        let currentTouchPosition = touch.locationInView(self.tableview)
        let indexPath = self.tableview.indexPathForRowAtPoint(currentTouchPosition)!
        selectindex = indexPath.row
        if selectedindex.containsObject(selectindex!) {
             sender.setBackgroundImage(UIImage.init(named: "like (1).png"), forState: .Normal)
             selectedindex.removeObject(selectindex!)
        }else{
             sender.setBackgroundImage(UIImage.init(named: "like.png"), forState: .Normal)
             selectedindex.addObject(selectindex!)
        }

}

答案 5 :(得分:0)

我最近遇到了这个问题,但没有发现太多。经过大量搜索之后,解决的方法是使用:

override func prepareForReuse() {

    btnAdd.setImage(nil, for: .normal) //here I use to change to none image
    super.prepareForReuse()
} 

只需将此方法放入自定义UITableViewCell中,然后设置要实现统计的项目即可。