自定义单元格中的按钮索引

Posted

技术标签:

【中文标题】自定义单元格中的按钮索引【英文标题】:index of button in custom cell 【发布时间】:2019-05-22 09:00:54 【问题描述】:

我创建了一个包含按钮的自定义单元格,我需要创建从这个按钮到其他 VC 的 segue,但首先,我想用那个 segue 推送一个对象。

我已经尝试使用 cell.button.tag,但没有成功。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 

        if segue.identifier == "showMap" 
            let mapVC = segue.destination as! MapViewController
            //guard let indexPath = tableView.indexPathForSelectedRow else  return 
            mapVC.place = places[] // <- "here I need index of button in cell"
        
    

【问题讨论】:

How to use navigationController.pushViewController in TableCell class?的可能重复 您可以使用委托方法didSelectItemAt indexPath 并且所选单元格的indexPath 将是已知的,或者使用手势识别器而不是segue。 【参考方案1】:

不使用segue,而是通过UITableViewCell 中的closure 以编程方式处理navigation

class CustomCell: UITableViewCell 
    var buttonTapHandler: (()->())?

    @IBAction func onTapButton(_ sender: UIButton) 
        self.buttonTapHandler?()
    

在上面的代码中,我创建了一个buttonTapHandler - 一个closure,只要点击cell 中的button,就会调用它。

现在,在cellForRowAt 方法中,当您dequeue 单元格时,设置buttonTapHandlerCustomCell

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell
    cell.buttonTapHandler = [weak self] in
        if let mapVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "MapViewController") as? MapViewController 
            mapVC.place = places[indexPath.row]
            self?.navigationController?.pushViewController(mapVC, animated: true)
        
    
    return cell

在上面的代码中,buttonTapHandler 在被调用时将push 一个新的MapViewController 实例以及基于indexPath 的相关place

【讨论】:

【参考方案2】:

如果您不想在 didSelectRowAt 方法中执行代码,我认为另一种好方法是创建自定义单元格的委托。请看下面的代码

// This is my custom cell class
class MyCustomCell: UITableViewCell 

    // The button inside your cell
    @IBOutlet weak var actionButton: UIButton!
    var delegate: MyCustomCellDelegate?

    @IBAction func myDelegateAction(_ sender: UIButton) 
        delegate?.myCustomAction(sender: sender, index: sender.tag)
    

    // Here you can set the tag value of the button to know
    // which button was tapped
    func configure(index: IndexPath)
       actionButton.tag = index.row
    



protocol MyCustomCellDelegate 
    func myDelegateAction(sender: UIButton, index: Int)

委派您使用自定义单元格的 ViewController。

class MyViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
      let cell = tableView.dequeueReusableCell(withIdentifier: "MyCellIdentifier", for: indexPath) as! MyCustomCell

      cell.configure(index: indexPath)
      cell.delegate = self

      return cell
    

最后自定义扩展自定义单元格委托的方法

extension MyViewController: MyCustomCellDelegate 

    func myDelegateAction(sender: UIButton, index: Int) 
        // Do your staff here
    

希望对你有所帮助。

【讨论】:

【参考方案3】:

在自定义单元格中:

import UIKit

protocol CustomCellDelegate: class 
    func btnPressed(of cell: CustomCell?)


class CustomCell: UITableViewCell 

    weak var delegate: CustomCellDelegate?

    @IBAction func btnTapped(_ sender: UIButton) 
        delegate?.btnPressed(of: self)
    


在视图控制器中:

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell: CustomCell = tableView.dequeueReusableCell(for: indexPath)
        cell.delegate = self

        return cell
    

    extension ViewController: CustomCellDelegate 

    func btnPressed(of cell: CustomCell?) 
        if let cell = cell, let indexPath = tableView.indexPath(for: cell) 
            // Your stuff here
        
    


【讨论】:

以上是关于自定义单元格中的按钮索引的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用自定义单元格中的按钮?

IOS/Objective-C:检测自定义表格视图单元格中的按钮按下?

从已知按钮标签更改自定义单元格中的特定按钮标题

突出显示时,表格单元格中的 iOS 自定义按钮变暗

Obj-C - 点击自定义表格视图单元格中的删除表格视图行按钮

如何为自定义表格视图单元格中的按钮单击获取不同的视图控制器