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

时间:2019-05-22 09:00:55

标签: ios swift uitableview

我创建了一个包含按钮的自定义单元格,我需要从该按钮创建segue到其他VC,但是首先,我想使用该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"
        }
    }

3 个答案:

答案 0 :(得分:1)

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

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

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

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

现在,在cellForRowAt方法中,当您dequeue设置单元格时,请设置buttonTapHandler中的CustomCell

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的新实例以及基于place的相关indexPath

答案 1 :(得分:0)

如果您不想在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
    }
}

我希望我能帮上忙。

答案 2 :(得分:0)

在自定义单元格中:

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

}