Swift 3:如何在UITableView中更改按钮图像?

时间:2017-06-07 08:01:51

标签: swift

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

   ...

 let doLikeBtn = detailCell.contentView.viewWithTag(106) as! UIButton
                doLikeBtn.setTitle(String(indexPath.row), for: UIControlState.normal)
                doLikeBtn.addTarget(self, action: #selector(doLike(sender:)), for: UIControlEvents.touchUpInside)

...

 }

...

 func doLike(sender: UIButton) {
        selectUserIndex = sender.title(for: UIControlState.normal)!

    if sender.image(for: UIControlState.normal) == UIImage(named: "btn_Like.png") {
        sender.setImage(UIImage(named: "btn_not_Like.png"), for: UIControlState.normal)
    }else {
        sender.setImage(UIImage(named: "btn_Like.png"), for: UIControlState.normal)
    }
 }

如果我单击表格中的一个按钮,然后更改按钮的图像,但其他一些按钮的图像也会反复更改。 我无法理解这一点。 请帮我! 最好的问候。

3 个答案:

答案 0 :(得分:0)

  

UITableViewCell对象是可重用的 - 这是出于性能原因,   您应该只重置与之无关的单元格的属性   内容。

因此,每次调用cellForRowAt时都需要更新您的单元格:

您还需要跟踪哪些细胞受到喜欢或不喜欢"所以你可以为YourCustomCell添加一个boolean isLike属性 并在doLike func触发时将其切换为true或false

            func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                let cell = tableView.deque... as! YourCustomCell

                if cell.isLiked == false {
                        cell.btnSomething.setImage(UIImage(named: "btn_not_Like.png"), for: UIControlState.normal)
                    }else {
                        cell.btnSomething.setImage(UIImage(named: "btn_Like.png"), for: UIControlState.normal)
                    }

                }

答案 1 :(得分:0)

  

更新了Swift 3/4:

使用代码行在UITableView中更改/设置UIButton图像;

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "YourTableViewCellStoryboardIdentifier")! as! YourTableViewCellName

        if status == 1{
            cell.mStatusButtonOutlet.setImage(UIImage(named: "pending_icon"), for: .normal)
        }else if status == 2{
            cell.mStatusButtonOutlet.setImage(UIImage(named: "approval"), for: .normal)
        }else if status == 3{
            cell.mStatusButtonOutlet.setImage(UIImage(named: "reject_icon"), for: .normal)
        }else{
            cell.mStatusButtonOutlet.setImage(UIImage(named: "cancle"), for: .normal)
        }

    return cell
}

注意:mStatusButtonOutlet - 您的UIButtonOutlet

享受..!

答案 2 :(得分:0)

在Swift 4中,下面是一个简单的方法

class AddressTableViewCell: UITableViewCell {
    @IBOutlet weak var starButton: UIButton!
    var buttonObject : (() -> Void)? = nil
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    @IBAction func buttonPressed(sender: UIButton) {
        if let buttonAction = self.buttonObject {
            buttonAction()
        }
    }
}

 public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
    let cell = tableView.dequeueReusableCell(withIdentifier: "addressTableViewCell", for: indexPath) as! AddressTableViewCell
    cell.buttonObject = {
        if cell.starButton.currentImage == UIImage(named: "fav") {
            cell.starButton.setImage(UIImage(named: "favYellow"), for: .normal)
        } else {
            cell.starButton.setImage(UIImage(named: "fav"), for: .normal)
        }
    }
    return cell
}