这是我的button
对象
let loginRegisterButton:UIButton = {
let button = UIButton(type: .system)
button.backgroundColor = UIColor(r: 50 , g: 80, b: 130)
button.setTitle("Register", for: .normal)
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitleColor(.white, for: .normal)
button.addTarget(self, action:#selector(handleRegister), for: .touchUpInside)
return button
}()
这是我的功能
func handleRegister(){
FIRAuth.auth()?.createUser(withEmail: email, password: password,completion: { (user, error) in
if error != nil
{ print("Error Occured")}
else
{print("Successfully Authenticated")}
})
}
我收到编译错误,如果addTarget删除它成功编译
答案 0 :(得分:89)
是的,如果没有参数
,请不要添加“()”button.addTarget(self, action:#selector(handleRegister), for: .touchUpInside).
如果你想获得发件人
button.addTarget(self, action:#selector(handleRegister(_:)), for: .touchUpInside).
func handleRegister(sender: UIButton){
//...
}
编辑:
button.addTarget(self, action:#selector(handleRegister(_:)), for: .touchUpInside)
不再有效,您需要使用函数头中使用的变量名替换选择器中的_
,在这种情况下它将是sender
,因此工作代码变为:
button.addTarget(self, action:#selector(handleRegister(sender:)), for: .touchUpInside)
答案 1 :(得分:17)
使用Swift 4
尝试此操作buttonSection.addTarget(self, action: #selector(actionWithParam(_:)), for: .touchUpInside)
@objc func actionWithParam(sender: UIButton){
//...
}
buttonSection.addTarget(self, action: #selector(actionWithoutParam), for: .touchUpInside)
@objc func actionWithoutParam(){
//...
}
答案 2 :(得分:13)
试试这个
button.addTarget(self, action:#selector(handleRegister()), for: .touchUpInside).
只需添加带有方法名称的括号。
您也可以参考链接:Value of type 'CustomButton' has no member 'touchDown'
答案 3 :(得分:7)
尝试使用swift 3
cell.TaxToolTips.tag = indexPath.row
cell.TaxToolTips.addTarget(self, action: #selector(InheritanceTaxViewController.displayToolTipDetails(_:)), for:.touchUpInside)
@objc func displayToolTipDetails(_ sender : UIButton) {
print(sender.tag)
let tooltipString = TaxToolTipsArray[sender.tag]
self.displayMyAlertMessage(userMessage: tooltipString, status: 202)
}
答案 4 :(得分:7)
{{1}}
答案 5 :(得分:3)
在swift 3中使用它 -
object?.addTarget(objectWhichHasMethod, action: #selector(classWhichHasMethod.yourMethod), for: someUIControlEvents)
例如(来自我的代码) -
self.datePicker?.addTarget(self, action:#selector(InfoTableViewCell.datePickerValueChanged), for: .valueChanged)
如果您希望将发件人作为参数,请在方法名称后面添加:
。
答案 6 :(得分:1)
海报在9月21日发表的第二条评论就是现场。对于那些后来可能会遇到与海报相同问题的人来说,这里有一个简短的解释。其他答案很好记住,但不解决此代码遇到的常见问题。
在Swift中,使用let
关键字进行的声明是常量。当然,如果你要向数组添加项目,那么数组不能被声明为常量,但是分段控件应该没问题,对吧?!如果您在声明中引用已完成的分段控件,则不会。
引用该对象(在本例中为UISegmentedControl
,但当您说UIButton
并让目标时,.addTarget
)声明中也会出现这种情况事情self
,事情崩溃了。为什么?因为self
正处于定义之中。但我们确实希望将行为定义为对象的一部分...将 lazily 声明为var
的变量。 lazy
愚弄编译器认为self
定义明确 - 它使你的编译器在声明时保持沉默。懒惰声明的变量在首次调用之前不会被设置。因此,在这种情况下,lazy
允许您在设置对象时使用self
的概念而不会出现问题,然后当您的对象获得.touchUpInside
或.valueChanged
或其他任何内容时你的第三个参数在你的.addTarget()
,那么中它调用了self
的概念,这个概念已经完全建立并完全准备好成为一个有效的目标。所以它让你懒得宣布你的变量。在这种情况下,我认为他们可以给我们一个关键字necessary
,但它通常被视为一种懒惰,草率的做法,你不想在你的代码中使用它,尽管它可能有它处于这种情况。它是什么
Swift中没有lazy let
(常量没有lazy
。
这是Apple documentation on lazy。
这是Apple on variables and constants。 Declarations下的语言参考中还有一些内容。
答案 7 :(得分:1)
使用Swift 3
尝试此操作button.addTarget(self, action:#selector(ClassName.handleRegister(sender:)), for: .touchUpInside)
祝你好运!
答案 8 :(得分:1)
而不是
let loginRegisterButton:UIButton = {
//... }()
尝试:
lazy var loginRegisterButton:UIButton = {
//... }()
那应该修复编译错误!!!
答案 9 :(得分:0)