在 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/