如何在swift 3中使用addTarget方法

时间:2016-09-21 13:24:15

标签: ios swift selector

这是我的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删除它成功编译

10 个答案:

答案 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 constantsDeclarations下的语言参考中还有一些内容。

答案 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)