如何在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方法的主要内容,如果未能解决你的问题,请参考以下文章

Swift:addTarget 动作是不是只允许类方法?

iOS:在 Swift 中重新创建 addTarget() 的最佳实践?

Swift4 - UIButton 在 UIView 中使用 addTarget 时出错

swift - xcode10 - 点击事件交互BUG - (手势和button的addTarget方法)

Swift: Swift中Selector的变化

UIButton 的 Swift addTarget 在 UIView 中不起作用