我的手机按钮有问题。 在我的tableView中,每一行由以下内容组成:图像,一些标签和一个按钮。 该按钮具有复选标记图像。单击时,按钮的图像会发生变化。 问题是另一个按钮的图像也没有理由地改变。 发生这种错误是因为我的细胞被重复使用。
我曾尝试在TableViewCell中使用prepareForReuse
方法,但没有任何反应。我也试过selectedRowAt
,但我没有任何结果。请帮帮我。
图片1:
图片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"
}
}
答案 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
中,然后设置要实现统计的项目即可。