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

时间:2015-09-14 05:46:01

标签: ios swift uitableview cocoa-touch

我有一个 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行中单击BUTTON而突出显示...

这是我的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 ......也有突出显示的按钮。

ROW 0,点击按钮

ROW ZERO , button clicked

ROW 3,按钮也被点击了,虽然我没有真正点击它。 enter image description here

3 个答案:

答案 0 :(得分:3)

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

检查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

}

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

答案 1 :(得分:0)

在这里,我的解决方案是为了扩展@RaymondLedCarasco评论:

在Swift 4 Xcode 9.3中测试

声明属性:

var numberCells: [Int] = []

单击单元格的按钮:

self.numberCells.append(indexPath.row)

在CellForRowAtIndex中检查:

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

答案 2 :(得分:0)

这里已解决了大多数TableViewCell问题,例如,滚动其余行后单击单元格按钮以及在 didSelectRowAt indexPath:IndexPath 中选择时,该行可能会更改,滚动后,可以选择其余的行。因此,我创建了一个应用来解决这些问题。在这里添加GitHub代码Find the code

  • 在第一个屏幕中,单击红色按钮,然后向下滚动,您将不会看到UITableViewCell中的其他单元格自动受到影响。

  • 在第一个屏幕中单击 didSelectRowAt indexPath:IndexPath ,您可以转到第二个屏幕的详细信息屏幕,在该屏幕中选择一行后,其他行将不会自动选择UITableViewCell。