快速地,如何在同一自定义表格视图单元格中管理两个按钮?

时间:2019-07-02 10:42:35

标签: ios swift uitableview uibutton

我正在尝试在同一自定义表格视图单元中管理两个按钮。 添加了两个名为“是”和“否”的按钮。如果选择了“是”按钮,则“否”按钮将处于非活动状态,而“是”按钮将变为活动状态。

这是我需要的图像

enter image description here

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "tableCell") as! TableViewCell
    cell.yesButton.tag = 101
    cell.noButton.tag = 102
    cell.yesButton.addTarget(self, action: #selector(buttonClicked(sender:)), for: UIControl.Event.touchUpInside)
    cell.noButton.addTarget(self, action: #selector(buttonClicked(sender:)), for: UIControl.Event.touchUpInside)
    return cell
}

 @objc func buttonClicked(sender: AnyObject) {
    let buttonPosition = (sender as AnyObject).convert(CGPoint.zero, to: tableList)
    let indexPath = tableList.indexPathForRow(at: buttonPosition)
    if sender.tag == 101 {
        if indexPath != nil {
            print("Cell indexpath = \(String(describing: indexPath?.row))")
        }
    }

    if sender.tag == 102 {
        if indexPath != nil {
            print("Cell indexpath = \(String(describing: indexPath?.row))")
        }
    }
}

4 个答案:

答案 0 :(得分:3)

创建一个模型以维护每个tableViewCell的yesButton和noButton的状态,即

class Model {
    var isYesSelected = false
    var isNoSelected = false
}

使用UITableViewCellOutlets的{​​{1}}创建自定义yesButton

noButton都创建一个@IBAction,并根据所点击的buttons处理其UI。

此外,使用button来标识在buttonTapHandler上被点击的row。每次点击button时都会调用它。在button中创建TableViewCell的实例时,将对此进行设置。

tableView(_:cellForRowAt:)

class TableViewCell: UITableViewCell { @IBOutlet weak var yesButton: UIButton! @IBOutlet weak var noButton: UIButton! var buttonTapHandler: (()->())? var model: Model? override func prepareForReuse() { super.prepareForReuse() yesButton.backgroundColor = .gray noButton.backgroundColor = .gray } func configure(with model: Model) { self.model = model self.updateUI() } @IBAction func onTapButton(_ sender: UIButton) { model?.isYesSelected = (sender == yesButton) model?.isNoSelected = !(sender == yesButton) self.updateUI() } func updateUI() { yesButton.backgroundColor = (model?.isYesSelected ?? false) ? .green : .gray noButton.backgroundColor = (model?.isNoSelected ?? false) ? .green : .gray } } UITableViewDataSource's方法就像

tableView(_:cellForRowAt:)

要获取let numberOfCells = 10 var models = [Model]() override func viewDidLoad() { super.viewDidLoad() (0..<numberOfCells).forEach { _ in self.models.append(Model()) } } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return numberOfCells } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "tableCell", for: indexPath) as! TableViewCell cell.configure(with: models[indexPath.row]) cell.buttonTapHandler = { print(indexPath.row) } return cell } ,请用totalPoints计算models,即

isYesSelected = true

答案 1 :(得分:1)

  • 创建基本tableView并配置dataSource函数 image1

  • 使用两个按钮创建tableView单元格 image2

  • 使用按钮出口和操作创建单元格类 image3

  • 此代码的结果

result gif

享受!

答案 2 :(得分:0)

使用如下所示的标签获取该按钮,然后,您可以根据需要更改值。

var tmpButton = self.view.viewWithTag(tmpTag) as? UIButton

答案 3 :(得分:0)

简单的3步程序... !!

  1. 定义模型类
  2. 准备tableView单元格并处理操作
  3. 在视图控制器中设置tableView

让我们开始实施:

1)定义模型类

在用户界面中,我们有一个信息,如问题及其答案(是/否)。因此分别设计模型。

//MARK:- Class Declaration -
class Question {
      let questionText: String
      var answerState: Bool?

      init(question: String) {
           self.questionText = question
      }
}

2。准备tableView单元格并处理操作

使用问题标签是按钮否按钮创建自定义tableView单元格。用受人尊敬的@IBOutlets和@IBActions链接该视图。

import UIKit

class TableViewCell: UITableViewCell {
      @IBOutlet weak var questionLabel: UILabel!
      @IBOutlet weak var yesButton: UIButton!
      @IBOutlet weak var noButton: UIButton!

      var question: Question?
      var toggle: Bool? {
          didSet {
                 question?.answerState = toggle
                 //Do buttons operations like...
                 if let isToggle = toggle {
                    yesButton.backgroundColor = isToggle ? .green : .gray
                    noButton.backgroundColor = isToggle ? .gray : .green
                 } else {
                    yesButton.backgroundColor =  .gray
                    noButton.backgroundColor = .gray
                 }
          }
      }

      func prepareView(forQuestion question: Question) {
           self.question = question
           questionLabel.text = question.questionText
           toggle = question.answerState
      }

      //Yes Button - IBAction Method
      @IBAction func yesButtonTapped(_ sender: UIButton) {
            toggle = true
      }

      //No Button - IBAction Method
      @IBAction func noButtonTapped(_ sender: UIButton) {
            toggle = false
      }
}

3。在视图控制器中设置tableView

class ViewController: UIViewController {

    //Prepare questions model array to design our tableView data source
    let arrQuestions: [Question] = [Question(question: "Do you speak English?"), Question(question: "Do you live in Chicago?")]
}

//MARK:- UITableView Data Source & Delegate Methods -
extension ViewController: UITableViewDataSource, UITableViewDelegate {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return arrQuestions.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let tableViewCell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell") as? TableViewCell else {
            return UITableViewCell()
        }
        tableViewCell.prepareView(forQuestion: arrQuestions[indexPath.row])
        return tableViewCell
    }

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