单击UIButton后如何更改UITableviewCell标签文本?

时间:2019-01-22 11:51:07

标签: ios swift uitableview

我在UITableViewCell中有一个复选框(UIButton)和一个标签。我想在单击复选框时更改标签的文本(颜色+删除线)。

这是针对配方应用程序的。在完成烹饪步骤后,用户可以“检查”完成。

这是tableView的当前cellForRowAt函数:

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if tableView == groceryTableView {
        let cell = tableView.dequeueReusableCell(withIdentifier: groceryTableViewCell, for: indexPath) as! GroceryItemTableViewCell
        cell.amoutLabel.text = indexPath.item % 2 == 0 ? "50 g" : "500 ml"
        cell.itemLabel.text = indexPath.item % 2 == 0 ? "Cheese" : "Milk"
        cell.selectionStyle = .none
        return cell
    }
    else {
        let cell = tableView.dequeueReusableCell(withIdentifier: cookingStepTableViewCell, for: indexPath) as! CookingStepTableViewCell
        cell.cookingStepDescription.text = indexPath.item % 2 == 0 ? "Test 123..." : "Test 321..."
        cell.selectionStyle = .none
        cell.delegate = self
        return cell
    }
}

这是我的Button addTarget函数,它从TableViewCell类委托给实际的ViewController类:

func cookingStepDone(description: String, isDone: Bool) {
    // if isDone == true
    // label textcolor is gray + strikethrough

    // if isDone == false
    // no change...
}

如果“ isDone”为true,我希望更改cell.cookingStepDescription标签(=单击复选框)

4 个答案:

答案 0 :(得分:1)

假定按钮出口位于单元格类中。因此,请在cellForRowAtIndexpath中声明一个操作方法,即像这样。

 cell.yourDoneBtn?.addTarget(self, action: #selector(self.cookingStepDone), for: .touchUpInside)

现在在您的动作功能中:

@objc func cookingStepDone(sender: UIButton)
 {
    let location = self.yourTableViewName?.convert(sender.bounds.origin, from:sender)
    let indexPath = self.yourTableViewName?.indexPathForRow(at: location!)
    if let cell = self.yourTableViewName.cellForRow(at: indexPath!) as? yourTableViewCell  // i.e groceryTableViewCell or CookingStepTableViewCell
    {
      if isDone == true
      {
        // Set your cell label textcolor to gray + strikethrough 
      }
      else
      {
       // no change
      }
    }
    DispatchQueue.main.async
    {
       self.yourTableView.reloadData() // reload your table view 
    }
 }

在需要的地方设置bool值。

答案 1 :(得分:0)

您可以使用以下方法进行操作

定义一个数组,在您的CookingStepDone方法中将indexPath添加到该数组中,如果Array中已存在indexPath,则将其删除并重新加载tableView。然后在cellForRowAtIndexpath方法中,检查Array是否包含indexPath。如果包含make文本strikeThrough,则使正常。

答案 2 :(得分:0)

如果您创建一个新类,该类的超类将是UITableViewCell,然后在该类中添加@IBOutlets(UIButton和UILabel)和@IBAction(buttonWasTapped),怎么办?

类似的东西

class RecipeTableViewCell: UITableViewCell {

    @IBOutlet var myButton : UIButton!
    @IBOutlet var myLabel : UILabel!

    @IBAction func didTouchButton(sender : UIButton)
    {
         myLabel.textColor = UIColor.green;
    }
}

答案 3 :(得分:0)

签出此代码: RecipeTableViewCell

class RecipeTableViewCell: UITableViewCell {

@IBOutlet var myButton : UIButton!
@IBOutlet var myLabel : UILabel!

var buttonClick : (() -> Void)? = nil

override func awakeFromNib() {
    myButton.addTarget(self, action: #selector(didTouchButton(sender:)), for: .touchUpInside)
}

@IBAction func didTouchButton(sender : UIButton)
{
    if let action = buttonClick {
        action()
    }
}
}

cellForRowAt

let cell = tableView.dequeueReusableCell... 
// Your code ...
cell.buttonClick = {
  //access your label and data from here
  cell.yourLbl.text = yourModel[indexPath.row].text
}