swift 3 在tableView 中按下了哪个单元格按钮

Posted

技术标签:

【中文标题】swift 3 在tableView 中按下了哪个单元格按钮【英文标题】:which cell button has pressed in tableView in swift 3 【发布时间】:2017-04-24 12:44:27 【问题描述】:

我读过类似的问题,但这些代码对我不起作用,所以请帮忙: 我有一个表格视图,每个单元格中有一些按钮 - 这个表格视图是用户的因素,我在该表格视图中添加了按钮 -​​ 当用户支付了钱时,按钮隐藏在该单元格中的那个因素和另一个单元格中的另一个因素时用户没付钱不隐藏—— 这就是我所做的 我想检测按下了哪些单元格按钮?! 我知道在表格视图中我们可以检测到哪个单元格被按下但这是不同的,因为用户只是按下该单元格中的按钮而不是按下所有单元格

由于我的代码太长,我只是把表格视图代码放在这里

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

    let cell = tableView.dequeueReusableCell(withIdentifier: "factorCell", for: indexPath) as! FactorCell

    cell.factorTitle.text = factorTitle[indexPath.row]
    cell.factorCode.text = factorCodes[indexPath.row]
    cell.factorDate.text = factorDate[indexPath.row]
    cell.factorHour.text = factorHour[indexPath.row]
    cell.factorPrice.text = factorPrice[indexPath.row]
    cell.factorCondition.text = factorConditions[indexPath.row]
    cell.factorBill.tag = indexPath.row
 cell.factorBill.addTarget(self,action:#selector(factorViewController.Bill), for: UIControlEvents.touchUpInside)

    cell.factorDetail.tag = indexPath.row    

    cell.factorDetail.addTarget(self,action:#selector(factorViewController.FactorDetail), for: .touchUpInside)


    if   factorConditions[indexPath.row] == "پرداخت شده"  


        cell.factorBill.isHidden = true


     else 

        cell.factorCondition.textColor = UIColor.red

        cell.factorBill.isHidden = false

    


    return cell


这是我想要的功能: 当用户点击支付他的因素并按下按钮时 - 移动到另一个视图控制器,在该视图控制器中,用户可以在该视图控制器中看到这些数据 --

**非常感谢如果你不明白我想做什么告诉我,我会解释更多**

【问题讨论】:

你能用#selector(factorViewController.Bill 和#selector(factorViewController.FactorDetail)方法更新你的问题吗 我编辑了问题 只需给你的按钮一个标签。在 IBAction 检查 sender.tag 我添加了我的按钮作为插座而且我知道我不需要使用 IBAction 你能帮帮我吗? 【参考方案1】:

在自定义单元格类中为您的按钮创建 IBAction,然后声明一个将在按钮单击时调用的块。

var ButtonHandler:(()-> Void)!

    @IBAction func ButtonClicked(_ sender: Any) 
            self.ButtonHandler()
        

然后在你的tableview类里面的单元格中进行row方法,

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = playlistTableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CustomTableViewCell
        cell.ButtonHandler = ()-> Void in
            // your code 
        
        return cell

【讨论】:

我的按钮是 IBOutlet 我可以在没有 IBAction 的情况下使用一些不同的东西吗?还是不? 你必须在你的单元格内创建一个 IBAction,这样你才能区分单元格点击和按钮点击【参考方案2】:

您在cellForRowAt 中设置因子按钮的标签,这样您就可以轻松地从factorViewController.Bill 获取索引路径,并且从该索引路径中您可以获得整个单元格,您可以做任何您需要的事情。

你可以得到细胞之类的,

 let cell = tableView.cellForRowAtIndexPath(indexPath)

您可以参考this so post 了解如何通过按钮单击获取索引路径!

【讨论】:

那么我应该在哪里添加这个? 请解释更多,因为当我将此代码放入我的代码时,由于错误而无法运行应用程序【参考方案3】:
  Here is update

just leave it, i explained it more simple,
create a button action in your cell class,then
Writre the code:-

> //Cell class

protocol CellDelegate: class 
    func didTapCell(index: IndexPath)

  var delegateCell:CellDelegate?
  var indexPath:IndexPath?
 @IBAction func buttonCellClick(_ sender: Any) 
        delegateCell?.didTapCell(index: indexPath!)
    

> //In ViewController

 cell.delegateCell = self
 cell.indexPath = indexPath

 func didTapCell(index: IndexPath) 
        print("PRESS BUTTON >> \(index.row)")
    

【讨论】:

请写出方法或解释更多 我应该在视图控制器的哪里写方法?因为我不能在 ViewDidLoad 或单元格中使用它作为索引路径或按钮 IBAction 中的行!另一个问题:我的代码是针对 IBOutlet 的,你能帮我在不使用 @IBAction 的情况下使用该方法吗 如果你不使用IBAction,那么没关系,在cell类中使用factorBill.addTarget(self,action:#selector(factorViewController.Bill), for: UIControlEvents.touchUpInside) 好的,谢谢它的解决 还有一件事要完成:在目标视图控制器中,我使用 let titletext = factorViewController().factorTitle 将选定的行带入目标视图控制器,但它不起作用 兄弟,在didTapCell(index:IndexPath)委托函数中你只能得到indexpath,你必须使用这个indexpath从数组中获取值(即let value = array(indexpath.row)【参考方案4】:

当您按下factorBill按钮时,您的Bill方法将被调用。因此您可以通过sender.tag轻松区分Bill方法中的按钮。您已经在cellForRowAt中设置了标签。

【讨论】:

以上是关于swift 3 在tableView 中按下了哪个单元格按钮的主要内容,如果未能解决你的问题,请参考以下文章

确定在 Tkinter 中按下了哪个按钮?

Swift:在警报视图中按下按钮后,tableView 不会重新加载数据

如何检测在 PyQt5 中按下了动态添加的按钮之一? [复制]

检测是不是在 C# 中按下了任何键(不是 A、B,而是任何键)

cellView 中的按钮我不知道用户按下了哪个单元格

检测是不是在 KeyRoutedEventArgs 事件中按下了修饰键