如何在swift 3中使用addTarget方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在swift 3中使用addTarget方法相关的知识,希望对你有一定的参考价值。
这是我的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删除它成功编译
是的,如果没有参数,请不要添加“()”
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)
尝试使用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()
//...
试试这个
button.addTarget(self, action:#selector(handleRegister()), for: .touchUpInside).
只需添加带有方法名称的括号即可。
你也可以参考链接:Value of type 'CustomButton' has no member 'touchDown'
尝试使用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)
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)
@objc public func backAction(_sender: UIButton)
在swift 3中使用此 -
object?.addTarget(objectWhichHasMethod, action: #selector(classWhichHasMethod.yourMethod), for: someUIControlEvents)
例如(来自我的代码) -
self.datePicker?.addTarget(self, action:#selector(InfoTableViewCell.datePickerValueChanged), for: .valueChanged)
如果您希望发件人作为参数,请在方法名称后面给出一个:
。
这张海报9月21日的第二条评论就是现货。对于那些后来可能会遇到与海报相同问题的人来说,这里有一个简短的解释。其他答案很好记住,但不解决此代码遇到的常见问题。
在Swift中,使用let
关键字进行的声明是常量。当然,如果你要向数组添加项目,那么数组不能被声明为常量,但是分段控件应该没问题,对吧?!如果您在声明中引用已完成的分段控件,则不会。
当你说UISegmentedControl
并让目标成为UIButton
时,引用该对象(在这种情况下是一个.addTarget
,但这也发生在self
),事情会崩溃。为什么?因为self
正处于定义之中。但我们确实希望将行为定义为对象的一部分...使用var
将其作为变量懒惰地声明。 lazy
愚弄编译器认为self
定义得很好 - 它使你的编译器在声明时保持沉默。懒惰声明的变量在首次调用之前不会被设置。因此在这种情况下,lazy
允许你在设置对象时使用self
的概念而没有问题,然后当你的对象得到.touchUpInside
或.valueChanged
或你的.addTarget()
中你的第三个参数时,那么它调用了self
的概念在那一点上完全建立并完全准备好成为一个有效的目标。所以它让你懒得宣布你的变量。在这样的情况下,我认为他们可以给我们一个关键字,如necessary
,但它通常被视为一种懒惰,草率的做法,你不想在你的代码中使用它,虽然它可能在这种类型中占有一席之地情况。什么
Swift中没有lazy let
(常量没有lazy
)。
这是Apple documentation on lazy。
这是Apple on variables and constants。在Declarations下的语言参考中还有一点。
尝试使用Swift 3
button.addTarget(self, action:#selector(ClassName.handleRegister(sender:)), for: .touchUpInside)
祝好运!
代替
let loginRegisterButton:UIButton =
//... ()
尝试:
lazy var loginRegisterButton:UIButton =
//... ()
那应该修复编译错误!
以上是关于如何在swift 3中使用addTarget方法的主要内容,如果未能解决你的问题,请参考以下文章
iOS:在 Swift 中重新创建 addTarget() 的最佳实践?
Swift4 - UIButton 在 UIView 中使用 addTarget 时出错