如何区分tableviewcell单击事件和tableviewcell单击事件中的按钮

时间:2018-01-23 08:54:35

标签: ios swift uitableview button tableview

我在tableviewcell中有一个按钮。我想分别捕获按钮单击事件和单元格单击事件。单击该按钮时,将导致按钮单击事件。单击单元格的其他部分时,将导致单元格单击事件。

问题是我点击按钮时,按钮点击事件share未执行,但是已执行单元格选择事件。

xib file the button

import UIKit

class ArticleTableViewCell: UITableViewCell {

    @IBOutlet weak var time: UILabel!
    @IBOutlet weak var digest: UILabel!
    @IBOutlet weak var share: UIButton!

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    @IBAction func share(_ sender: Any) {
        print("share")
    }
}

4 个答案:

答案 0 :(得分:1)

您可以使用delegate方法didSelectRowAtIndexPath获取整个单元格的点击事件。您必须将表视图的委托设置为文件的所有者(Controller)。

为了获得按钮的click事件,我总是进行以下解决方法。将标记添加到按钮indexpath.row。将目标添加到按钮。在选择器功能中,您可以使用sender.tag获取单击的单元格按钮。

答案 1 :(得分:1)

我原以为这个问题是由图层序列引起的。然后在@AndreaMugnaini,@ FahriAzimov,@MilanNosáľ的帮助下,我知道层序不是问题。

然后我认为它可能是由布局引起的。所以我检查了约束,我发现有一个额外的约束。我删除了8.5约束,效果很好。

enter image description here

答案 2 :(得分:1)

单击单元格didSelectRowAt时会调用。

对于Button事件,您需要在ArticleTableViewCell课程中创建自定义委托方法。如下所示:

import UIKit

protocol ButtonDelegateCell {
    func shareButtonDidPressed()
}

class ArticleTableViewCell: UITableViewCell {

    @IBOutlet weak var time: UILabel!
    @IBOutlet weak var digest: UILabel!
    @IBOutlet weak var share: UIButton!

    var delegate: ButtonDelegateCell?


    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    @IBAction func share(_ sender: Any) {
        delegate?.shareButtonDidPressed()
        print("share")
    }
}

现在,在didSelectRowAt设置您的委托如下:

cell.delegate = self

然后在下面的ViewController行中实现您的委托方法:

func didButtonPressed() {
        // When you click on Share button this method will called
}

答案 3 :(得分:1)

  

首先在控制器中添加要使用单元格的委托和数据源。

class viewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    override func viewDidLoad() {

        // if you want use xib in tableview then open it and add your xib name to replace - ArticleTableViewCell
        //tableView.register(UINib(nibName: "ArticleTableViewCell", bundle: nil), forCellReuseIdentifier: "ArticleTableViewCell")
    }

    func btn_Handler_Share(sender:UIButton) {
        let selectedIndexpath = sender.tag
        print(selectedIndexpath)
    }

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

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

        cell.share.tag = indexPath.row
        cell.share.addTarget(self,action:#selector(btn_Handler_Share(sender:)), for: .touchUpInside)

        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print(indexPath.row)
    }

}
  

如果存在,则将共享按钮的操作删除到ArticleTableViewCell(UITableViewCell)中。