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

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

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

但现在我有一个@IBOutlet

@IBOutlet weak var nextTrackCell: nextTableViewCell!

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

【问题讨论】:

    标签: ios swift4 ibaction iboutlet


    【解决方案1】:

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

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

    【讨论】:

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

    【讨论】:

      猜你喜欢
      • 2015-05-27
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-05
      • 2021-12-06
      • 2017-08-18
      • 1970-01-01
      相关资源
      最近更新 更多