自定义UITableViewCell中的按钮操作会影响其他单元格

我有一个TablewView ,它有原型UITableViewCell ,它有自己的类,

自定义UITableViewCell类

import UIKit class H_MissingPersonTableViewCell: UITableViewCell { @IBOutlet weak var strName: UILabel! @IBOutlet weak var imgPerson: UIImageView! @IBOutlet weak var Date1: UILabel! @IBOutlet weak var Date2: UILabel! @IBOutlet weak var MainView: UIView! @IBOutlet weak var btnGetUpdates: UIButton! @IBOutlet weak var btnComment: UIButton! @IBOutlet weak var btnReadMore: UIButton! override func awakeFromNib() { super.awakeFromNib() // Initialization code } override func setSelected(selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } } 

TableView加载完美,dataSource和委托工作正常。 但是,当我在IndexPath.row = 0(零)处单击按钮,然后向下滚动时,我会看到随机(?)或其他单元格也因为在行0中单击按钮而突出显示…

这是我的CellForRowAtIndexPath代码:

  func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { println("called") var cell : CustomCell cell = tableView.dequeueReusableCellWithIdentifier("CustomCellID", forIndexPath: indexPath) as! CustomCell cell.strName.text = self.names[indexPath.row] cell.imgPerson.image = UIImage(named: "\(self.persons[indexPath.row])")! cell.btnGetUpdates.layer.borderColor = UIColor.darkGrayColor().CGColor cell.btnGetUpdates.layer.borderWidth = 1 cell.btnGetUpdates.layer.cornerRadius = 5.0 cell.btnComment.layer.borderColor = UIColor.darkGrayColor().CGColor cell.btnComment.layer.borderWidth = 1 cell.btnComment.layer.cornerRadius = 5.0 cell.btnReadMore.layer.borderColor = UIColor.darkGrayColor().CGColor cell.btnReadMore.layer.borderWidth = 1 cell.btnReadMore.layer.cornerRadius = 5.0 cell.dateMissingPersonPlace.text = self.MissingPeoplePlace[indexPath.row] cell.dateMissingPersonSince.text = self.MissingPeopleSince[indexPath.row] cell.btnGetUpdates.tag = indexPath.row cell.btnGetUpdates.addTarget(self, action: "GetUpdatesButton:", forControlEvents: .TouchUpInside) return cell } 

在我的cell.btnGetUpdates中 ,我提出了一个动作,你可以在我的CellForIndex代码的最后一部分看到GetUpdatesButton:

这是代码:

 func GetUpdatesButton(sender: UIButton){ println("Button Clicked \(sender.tag)") var sen: UIButton = sender var g : NSIndexPath = NSIndexPath(forRow: sen.tag, inSection: 0) var t : CustomCell = self.myTableView.cellForRowAtIndexPath(g) as! CustomCell t.btnGetUpdates.backgroundColor = UIColor.redColor() } 

问题是,不仅仅是索引0中的按钮被突出显示,而且当我向下滚动tableView时,我还会看到其他索引/行中的随机按钮被突出显示。

我哪里出错了,怎么才能更新我点击的按钮…而不是其他按钮..

我有20个项目(20行),当我点击第0行的按钮时,第3,6,9行….也有突出显示的按钮。

行0,点击按钮

ROW ZERO,点击按钮

第3行,也点击了按钮,虽然我没有真正点击它。 在此处输入图像描述

这是因为UITableview具有可重用单元策略。为了解决此问题,您需要在cellForRowAtIndexPath方法中维护一个选定项目数组,您必须validation所选项目数组正在保持此按钮的天气。 如果是,则应用选择样式,否则应用正常样式。

检查下面的buttonclick源代码:

 func GetUpdatesButton(sender: UIButton) { var sen: UIButton = sender var g : NSIndexPath = NSIndexPath(forRow: sen.tag, inSection: 0) var t : CustomCell = self.myTableView.cellForRowAtIndexPath(g) as! CustomCell t.btnGetUpdates.backgroundColor = UIColor.redColor() self.selectedButtonsArray.addObject(indexpath.row) } 

下面的代码用于在CellForRowAtIndexPath中的按钮上应用样式:

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell : CustomCell cell = tableView.dequeueReusableCellWithIdentifier("CustomCellID", forIndexPath: indexPath) as! CustomCell cell.strName.text = self.names[indexPath.row] cell.imgPerson.image = UIImage(named: "\(self.persons[indexPath.row])")! if(self.selectedButtonsArray.containsObject(indexpath.row)){ cell.btnGetUpdates.backgroundColor = UIColor.redColor() cell.btnGetUpdates.layer.borderColor = UIColor.darkGrayColor().CGColor cell.btnGetUpdates.layer.borderWidth = 1 cell.btnGetUpdates.layer.cornerRadius = 5.0 }else{ cell.btnGetUpdates.layer.borderColor = UIColor.darkGrayColor().CGColor cell.btnGetUpdates.layer.borderWidth = 1 cell.btnGetUpdates.layer.cornerRadius = 5.0 } cell.btnComment.layer.borderColor = UIColor.darkGrayColor().CGColor cell.btnComment.layer.borderWidth = 1 cell.btnComment.layer.cornerRadius = 5.0 cell.btnReadMore.layer.borderColor = UIColor.darkGrayColor().CGColor cell.btnReadMore.layer.borderWidth = 1 cell.btnReadMore.layer.cornerRadius = 5.0 cell.dateMissingPersonPlace.text = self.MissingPeoplePlace[indexPath.row] cell.dateMissingPersonSince.text = self.MissingPeopleSince[indexPath.row] cell.btnGetUpdates.tag = indexPath.row cell.btnGetUpdates.addTarget(self, action: "GetUpdatesButton:",forControlEvents: .TouchUpInside) return cell 

}

我希望这有助于解决您的问题! 谢谢。

在GetUpdatesButton()函数内部,在单独的数组中保留indexPath.row值的标志值。 然后重新加载表视图的特定单元格。

现在在cellForRowAtIndexPath函数中设置是否设置检查标志值的条件,如果设置则更改背景颜色,否则设置默认颜色。

PS。 有不同类型的工作来解决这个问题。 只需了解逻辑并选择在代码中有用的逻辑。

这是因为细胞正在被重复使用。 因此,当您使用按钮操作为单元格着色时,单元格的背景正在被绘制,我认为它正常工作但情况是,当您向上或向下滚动时,前一个具有bg颜色的单元格正在被重用,因此您将获得以前的设置。

一个提示是在这个方法func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell显式设置UIButtonUITableViewCell的背景颜色,因为每次它将被重用时颜色将被设置为默认值,你将没有得到它重复使用的旧颜色。

刚设置

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { cell.backgroundColor = [UIColor whiteColor]; cell.btnGetUpdates setBackgroundColor:[UIColor whiteColor]; //with along the other code, add these two lines. } 

编辑

为了获得你想要的效果,设置一个实例变量,它存储所选Cell的indexPath,就像int一样。

在按钮操作方法中,将int存储到button.tag属性,该属性也是单元格的indexpath.row属性。

在您的cellForRowAtIndexPath方法中,进行检查

 if(indexpath.row == selectedIntIndexPath){ //change the colour whatever you want. } 

最后在按钮调用的IBAction方法中[self.tableView reloadData]

所以完整的代码将是这样的

 @implementation ViewController{ int selectedIntIndexPath; } -(IBAction)actionForButton:(id)sender{ UIButton *btn = (UIButton *)sender; selectedIntIndexPath = btn.tag; [self.customTableView reloadData]; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UICustomTableViewCell *cell = (UICustomTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"reuseIdentifire" forIndexPath:indexPath]; if(indexPath.row == selectedIntIndexPath){ // do your colour } return cell; } 

在这里我的解决方案,以扩大@RaymondLedCarasco评论:

在Swift 4 Xcode 9.3中测试

声明一个属性:

 var numberCells: [Int] = [] 

单击Cell按钮时:

 self.numberCells.append(indexPath.row) 

在CellForRowAtIndex中检查:

 if self.numberCells.contains(indexPath.row) { ... } else { ... }