gpt4 book ai didi

ios - 如何更改特定 TableViewCell 中的按钮颜色

转载 作者:行者123 更新时间:2023-11-28 06:15:57 25 4
gpt4 key购买 nike

我有一个类似测验应用程序的应用程序。在 tableViewCell 中,有 4 个按钮用于任务的变体。当用户按下按钮时,我需要更改颜色,当我尝试仅在按钮操作中更改颜色时,所有表格 View 单元格中的按钮颜色都会更改。但我只需要改变我按下的那个地方。我已经尝试编写委托(delegate),但它给出了相同的结果这是我编写委托(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)
}
}
}

我已经为按钮添加了目标操作。

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
}

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

    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


}

这是 Storyboard中的样子(如果有帮助) enter image description here

最佳答案

我认为你使用的代码比你真正需要做的要多得多customCell 调用了 ButtonTableViewCell,然后我将一个普通的 UIButton 作为 @IBOutlet 链接到该单元格,仅此而已,完整的实现在这里

https://github.com/rmelian2014/SOButtonsTableViewCellQuestion

已编辑

按钮 TableView 单元格

    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
}

}

View Controller

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")
}
}

希望对你有帮助

关于ios - 如何更改特定 TableViewCell 中的按钮颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45135516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com