如何更改特定 TableViewCell 中的按钮颜色 [英] How to change Button color in specific TableViewCell

查看:11
本文介绍了如何更改特定 TableViewCell 中的按钮颜色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个类似测验应用的应用.在 tableViewCell 中有 4 个用于任务变体的按钮.当用户按下按钮时,我需要更改颜色,当我尝试在按钮操作中更改颜色时,所有表格视图单元格中的按钮颜色都会发生变化.但我只需要在我按下的地方进行更改.我已经尝试过编写委托,但它给出的结果相同,这是我编写委托的代码:

I have an app like a quiz app. In tableViewCell there are 4 buttons for variants of the task. And I need to change color when the user is pressed the button, when I try to just change color in action of button the color of button changes in all table view Cells. But I need to change only in that, where I pressed. I already tried to write delegate, But it is giving the same result this is code how I wrote my delegate:

class CustomButton: UIButton {

override var isHighlighted: Bool {
    didSet {
        if isHighlighted {
            backgroundColor = UIColor.lightGray
        } else {
            backgroundColor = UIColor.init(red: 34/255, green: 89/255, blue: 128/255, alpha: 1.0)
        }
    }
}

}

我已经为按钮添加了目标动作.

I already have added target actions to buttons.

var variant1 = UIButton()
var variant2 = UIButton()
var variant3 = UIButton()
var variant4 = UIButton()

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "finalCell")!
    variant1 = cell.contentView.viewWithTag(1) as! UIButton
    variant2 = cell.contentView.viewWithTag(2) as! UIButton
    variant3 = cell.contentView.viewWithTag(3) as! UIButton
    variant4 = cell.contentView.viewWithTag(4) as! UIButton


    if (numberOfVariants.count != 0) {
        let questionTextView = cell.contentView.viewWithTag(5) as! UITextView
        questionTextView.text = "(Questions[indexPath.row].content!)"
        variant1.addTarget(self, action: #selector(self.variant1ButtonPressed), for: .touchUpInside)
        variant2.addTarget(self, action: #selector(self.variant2ButtonPressed), for: .touchUpInside)
        variant3.addTarget(self, action: #selector(self.variant3ButtonPressed), for: .touchUpInside)
        variant4.addTarget(self, action: #selector(self.variant4ButtonPressed), for: .touchUpInside)
          }
        return cell
    }

当用户点击按钮时,我已经确定了表格视图的 indexPath(如果有帮助的话):

I already identified the indexPath of table view (if it is helpful), when the user clicked to button:

    func variant1ButtonPressed(_ sender:AnyObject) {
    print("Variant1")
    let buttonPosition:CGPoint = sender.convert(CGPoint.zero, to:self.tableView)
    let indexPath = self.tableView.indexPathForRow(at: buttonPosition)
    let intIndexpath = Int((indexPath?.row)!)
    globalIndexPath = intIndexpath
}
func variant2ButtonPressed(_ sender:AnyObject) {
    let buttonPosition:CGPoint = sender.convert(CGPoint.zero, to:self.tableView)
    let indexPath = self.tableView.indexPathForRow(at: buttonPosition)
    let intIndexpath = Int((indexPath?.row)!)
    globalIndexPath = intIndexpath

}
func variant3ButtonPressed(_ sender:AnyObject) {
    let buttonPosition:CGPoint = sender.convert(CGPoint.zero, to:self.tableView)
    let indexPath = self.tableView.indexPathForRow(at: buttonPosition)
    let intIndexpath = Int((indexPath?.row)!)
    globalIndexPath = intIndexpath


}
func variant4ButtonPressed(_ sender:AnyObject) {
    let buttonPosition:CGPoint = sender.convert(CGPoint.zero, to:self.tableView)
    let indexPath = self.tableView.indexPathForRow(at: buttonPosition)
    let intIndexpath = Int((indexPath?.row)!)
    globalIndexPath = intIndexpath


}

这是它在故事板中的样子(如果有帮助)

This how its looks like in storyboard(If it is helpful)

推荐答案

我认为你使用的代码比你真正需要的要多得多,所以这是使用 closures 的另一种方法,我在我的故事板中只有一个 viewController 并在里面添加一个 UITableView 和一个名为 ButtonTableViewCell 的 customCell 然后我将一个普通的 UIButton 链接到该单元格作为 @IBOutlet 就是这样,完整的实现在这里

I think you are using much more code than you really need to do this task, so this is another approach using closures, I have only one viewController in my storyboard and add a UITableView inside and a customCell called ButtonTableViewCell then I linked a normal UIButton to that cell as @IBOutlet and that is all, the full implementation is here

https://github.com/rmelian2014/SOButtonsTableViewCellQuestion

    import UIKit

@IBDesignable
class ButtonTableViewCell: UITableViewCell {

    @IBInspectable var selectedColor : UIColor = UIColor.red
    @IBInspectable var normalColor : UIColor = UIColor.blue

    static let cellHeigth : CGFloat = 360

    @IBOutlet var buttonsArray: [UIButton]!
    var selectedText : String?{
        willSet{
            guard newValue != nil else{
                return
            }

            var foundedIndex = -1
            for (index,text) in self.texts.enumerated() {
                if(text == newValue!){
                    foundedIndex = index
                    break
                }
            }

            guard foundedIndex != -1 else
            {
                return
            }

            self.buttonsArray[foundedIndex].backgroundColor = selectedColor
        }
    }
    var texts : [String] = []

    var buttonActionClosure : ((_ selectedText:String?)->Void)?

    func setupWithClosure(texts:[String],textSelected:String?,closure:((_ selectedText:String?)->Void)?)
    {
        self.texts = texts

        for (index,button) in self.buttonsArray.enumerated(){
            if(self.texts.count > index)
            {
                button.setTitle(self.texts[index], for: .normal)
            }
            button.tag = index
            button.backgroundColor = self.normalColor
        }


        self.selectedText = textSelected
        if(closure != nil)
        {
            self.buttonActionClosure = closure
        }


    }

    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
    }

    @IBAction func buttonAction(sender:UIButton)
    {
        if(self.texts.count > sender.tag){
            let newSelectedText = self.texts[sender.tag]

            if(newSelectedText != self.selectedText){
                self.selectedText = newSelectedText
            }else
            {
                self.selectedText = nil
            }
        }
        if(self.buttonActionClosure != nil)
        {
            self.buttonActionClosure!(self.selectedText)
        }
    }

    override func prepareForReuse() {
        super.prepareForReuse()
        self.buttonActionClosure = nil
    }

}

视图控制器

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!

    var dictOfSelectedsCells : [Int:String?] = [:]

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        tableView.delegate = self
        tableView.dataSource = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

extension ViewController : UITableViewDelegate,UITableViewDataSource
{
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 4
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return ButtonTableViewCell.cellHeigth
    }

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

        if let cell = tableView.dequeueReusableCell(withIdentifier: "ButtonTableViewCell", for: indexPath) as? ButtonTableViewCell
        {
            cell.selectionStyle = .none
            var selectedText : String?
            if let currentSelectedText = self.dictOfSelectedsCells[indexPath.row]
            {
                selectedText = currentSelectedText
            }

            cell.setupWithClosure(texts:["Variant1","Variant2","Variant3","Variant4"], textSelected: selectedText, closure: { [weak self] (selected) in
                debugPrint(indexPath)
                self?.dictOfSelectedsCells[indexPath.row] = selected
                tableView.reloadRows(at: [indexPath], with: .none)
            })

            return cell
        }
        assert(false, "this must not happen")
    }
}

希望对你有帮助

这篇关于如何更改特定 TableViewCell 中的按钮颜色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆