ios - 如何在 Swift 3 中编写带有参数的选择器

标签 ios swift swift3 selector

在 Swift 2 中,这曾经有效(我故意省略了 TableView 方法)...

 import Foundation
 import UIKit

 private extension Selector {
    static let didTapButton = #selector(TableVC.buttonTapped(_ :))

 }

 class TableVC: UITableViewController{

     override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
         let btnAccView:UIButton = UIButton(frame: CGRectMake(0, 0, 27, 27))
         btnAccView.addTarget(self, action: .didTapButton, forControlEvents: UIControlEvents.TouchUpInside)
         btnAccView.tag = indexPath.row
     }


     func buttonTapped(sender: UIButton){
         print("button tapped at row \(sender.tag)")
     }

 }

在 Swift 3 中,这会导致错误:“TableVC 没有成员 buttonTapped”。

我只需要编写一个带有参数的选择器。 我尝试过以我能想到的各种方式摆弄语法,但没有任何效果。感谢您的帮助

最佳答案

首先,您需要修改 buttonTapped 以便抑制第一个参数标签。在内部参数标签之前插入下划线,使其看起来像这样:

func buttonTapped(_ sender: UIButton) {

之前,其方法签名为 TableVC.buttonTapped(sender:),现在其签名为 TableVC.buttonTapped(_:)。您可能需要删除扩展中下划线和冒号之间的空格,但之后它应该可以工作。

顺便说一句,您在此处使用 Selector 扩展有什么特殊原因吗?该扩展模型通常对于诸如通知名称之类的内容最有用,这些内容很容易拼写错误,从而导致棘手的错误。由于 Swift 编译器会自动验证 #selector 声明,无论它们放置在何处,因此您可以将其直接放入代码中,无需扩展。

关于ios - 如何在 Swift 3 中编写带有参数的选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40512752/

相关文章:

php - 我从 iOS 和 Postman 使用 PHP 上传文件时遇到部分文件上传错误

ios - 应用程序在切换到前置摄像头时崩溃

swift - CGVectorMake 在 Swift 中不可用

ios - 读取wkwebview Console.log

ios - IBOutlet 崩溃与 EXC_BAD_ACCESS 即使不是零

ios - 如何按位置对矩形数组进行排序?

ios - JavaFXPorts - 移动设备上的滚动条问题

swift - Firebase 检查帐户是否被禁用

ios - 以编程方式锁定 iDevice 方向

swift - 过滤一对多的导航属性