如何在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 = { //... }()
这应该修复编译错误!