来自 tableViewCell 的快速@IBAction

Posted

技术标签:

【中文标题】来自 tableViewCell 的快速@IBAction【英文标题】:swift @IBAction from tableViewCell 【发布时间】:2017-10-19 10:50:22 【问题描述】:

我需要通过点击一个tableViewCell来触发一个函数, 直到现在我使用@IBAction,但该选项仅适用于按钮类型(我还没有找到另一种方式..) 这就是我现在的方式:

@IBAction func springPrs(_ sender: Any) 
    //doing stuff.. 

但现在我有一个@IBOutlet

@IBOutlet weak var nextTrackCell: nextTableViewCell!

我想通过点击来触发一个功能。有什么帮助吗?

【问题讨论】:

【参考方案1】:

这是一个错误的方法,你应该从UITableViewDelegate实现一个名为didSelectRowAt的委托方法:

  public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
          //do your stuff here.
        

【讨论】:

谢谢,但问题是我在表格视图之外创建了一个单元格,我是 swift 新手,我猜这不是正确的做法(我想知道缺点),但仍有办法吗? 是,这是做你想做的事情的正确方法。此外,您不应在 tableview 之外创建单元格。单元格是为与 tableview 一起使用而设计的,而不是单独使用。如果您使用的是单个单元格,请考虑改为通过 UIView 切换它 如何为 UIview 创建“onclick”功能? 这个答案会帮助你:***.com/questions/30505165/…【参考方案2】:

您不应该将操作直接添加到表格视图单元格,因为它违反了 MVC 设计模式,并且 UITableViewDelegate 中已经内置了一个方便的回调来使这非常容易。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    if indexPath.row == 0 
        // do something when the top row tapped
     else 
        // do something when any other row is tapped
    

【讨论】:

我认为override关键字会触发编译器错误。 @LuizFernandoSalvaterra 你是对的,我很抱歉。如果使用已经实现委托回调的UITableViewController,那将是代码。 对,我也用这个方法哈哈哈【参考方案3】:

您也可以在单元格内声明一个闭包,这是我在必须将某些操作传递给视图控制器时倾向于使用的。

var onButtonPressed: (() -> ())?

@IBAction func buttonPressed(_ sender: Any) 
    onButtonPressed?()

并在cellForRowAt中这样使用它:

cell.onButtonPressed =  [unowned self] in
    // Do what you need to, no need to capture self however, if you won't access it.

【讨论】:

以上是关于来自 tableViewCell 的快速@IBAction的主要内容,如果未能解决你的问题,请参考以下文章

Swift:来自 XIB 文件的多个自定义 TableViewCell

快速手势识别器 tableviewcell 被否决

tableViewCell 的高度和宽度在快速滚动时发生变化

快速具有多个部分和多行的表格视图

快速,从具有 CustomCells 的 tableViewCells 中检索更改的数据

允许用户使用来自不同视图控制器中的标签的文本创建新的 tableViewCells?