如何在swift中使用addTarget方法3

这里是我的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 }() 

这是我的function

  func handleRegister(){ FIRAuth.auth()?.createUser(withEmail: email, password: password,completion: { (user, error) in if error != nil { print("Error Occured")} else {print("Successfully Authenticated")} }) } 

我得到编译错误,如果addTarget删除它编译成功

是的,如果没有参数,不要加“()”

 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) 

不再有效,你需要用你在函数头中使用的variables名replaceselect器中的_ ,在这种情况下,它将是sender ,所以工作代码变成:

 button.addTarget(self, action:#selector(handleRegister(sender:)), for: .touchUpInside) 

尝试这个

 button.addTarget(self, action:#selector(handleRegister()), for: .touchUpInside). 

只需添加括号与方法的名称。

你也可以参考链接: types'CustomButton'的值没有成员'touchDown'

快速尝试3

 cell.TaxToolTips.tag = indexPath.row cell.TaxToolTips.addTarget(self, action: #selector(InheritanceTaxViewController.displayToolTipDetails(_:)), for:.touchUpInside) func displayToolTipDetails(_ sender : UIButton) { print(sender.tag) let tooltipString = TaxToolTipsArray[sender.tag] self.displayMyAlertMessage(userMessage: tooltipString, status: 202) } 
  let button: UIButton = UIButton() button.setImage(UIImage(named:"imagename"), for: .normal) button.addTarget(self, action:#selector(YourClassName.backAction(_sender:)), for: .touchUpInside) button.frame = CGRect.init(x: 5, y: 100, width: 45, height: 45) view.addSubview(button) public func backAction(_sender: UIButton) { } 

在迅捷3使用这个 –

 object?.addTarget(objectWhichHasMethod, action: #selector(classWhichHasMethod.yourMethod), for: someUIControlEvents) 

例如(从我的代码) –

 self.datePicker?.addTarget(self, action:#selector(InfoTableViewCell.datePickerValueChanged), for: .valueChanged) 

只要给方法名称之后,如果你想发件人作为参数。

用Swift 4试试这个

 buttonSection.addTarget(self, action: #selector(actionWithParam(_:)), for: .touchUpInside) func actionWithParam(sender: UIButton){ //... } buttonSection.addTarget(self, action: #selector(actionWithoutParam), for: .touchUpInside) func actionWithoutParam(){ //... } 

用Swift 3试试这个

 button.addTarget(self, action:#selector(ClassName.handleRegister(sender:)), for: .touchUpInside) 

祝你好运!

海报从9月21日的第二个评论是现货。 对于那些稍后可能会遇到和海报一样的问题的人来说,这里是一个简单的解释。 其他答案很好记,但不要解决这个代码遇到的常见问题。

在Swift中,用let关键字做的声明是常量。 当然,如果你要添加项目到一个数组,数组不能被声明为一个常量,但分段控制应该没问题,对不对? 如果您在声明中引用完整的分段控制,则不是。

当你说.addTarget时,引用对象(在这种情况下是一个UISegmentedControl ,但这也发生在UIButton ),让目标变成self ,事情就会崩溃。 为什么? 因为self正在被定义。 但是我们希望将行为定义为对象的一部分…将它声明为var的variables。 lazy的编译器认为self的定义很清晰 – 它使编译器在声明时保持沉默。 懒惰声明的variables在被首次调用之前不会被设置。 所以在这种情况下, lazy可以让你在设置对象的时候使用self的概念,而当你的对象得到一个.touchUpInside.valueChanged或者你的第三个参数在你的.addTarget() ,它会调用关于self的概念,在这一点上已经完全build立并完全准备好成为一个有效的目标。 所以它可以让你懒惰声明你的variables。 在这样的情况下,我认为他们可以给我们一个关键字,但是它通常被认为是一个懒惰的,草率的实践,你不想在代码中使用它,尽pipe它可能在这种types中占有一席之地的情况。 什么

在Swift中没有lazy对于常量不lazy )。

这里是懒惰的苹果文档 。

这里是苹果的variables和常量 。 在声明下的语言参考中还有一点。

代替

 let loginRegisterButton:UIButton = { //... }() 

尝试:

 lazy var loginRegisterButton:UIButton = { //... }() 

这应该修复编译错误!