web-dev-qa-db-ja.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が正常にコンパイルを削除した場合、コンパイルエラーが発生します。

50
Ninja13

はい、パラメータがない場合は「()」を追加しないでください

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)
92
Damien Romito

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(){
    //...
}
18
Soumen

これを試して

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

メソッドの名前に括弧を追加するだけです。

また、リンクを参照することもできます: タイプ 'CustomButton'の値にはメンバー 'touchDown'がありません

13
VRAwesome
  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) {

    }
7
Giang

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)    
}
7
eranda.del

Swift 3ではこれを使用します-

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

たとえば(私のコードから)-

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

パラメーターとして送信者が必要な場合は、メソッド名の後に:を指定します。

3
Nikhil Manapure

9月21日からのポスターの2番目のコメントが注目されています。後でポスターと同じ問題でこのスレッドに来るかもしれない人のために、ここに簡単な説明があります。他の答えは心に留めておくのは良いことですが、このコードが遭遇する一般的な問題には対処しません。

Swiftでは、letキーワードで作成された宣言は定数です。もちろん、配列にアイテムを追加する場合、配列を定数として宣言することはできませんが、セグメント化されたコントロールは問題ないはずです!宣言で完成したセグメント化されたコントロールを参照する場合ではありません。

オブジェクトの参照(この場合はUISegmentedControlですが、これはUIButtonでも発生します)その宣言で.addTargetと言い、ターゲットをself、物事はクラッシュします。どうして? selfは定義されている最中であるためです。しかし、オブジェクトの一部として振る舞いを定義したいのです...それを宣言してくださいlazilyvarを持つ変数として。 lazyは、コンパイラを欺いてselfが適切に定義されていると考えさせます-宣言時にコンパイラが気にしないようにします。遅延宣言された変数は、最初に呼び出されるまで設定されません。したがって、この状況では、lazyを使用すると、オブジェクトのセットアップ中にselfの概念を問題なく使用でき、オブジェクトが.touchUpInsideまたは.valueChangedなどを取得したときに3番目の引数は.addTarget()にあり、THENは、selfの概念を呼び出します。これは、その時点で完全に確立され、有効なターゲットになるために完全に準備されます。そのため、変数の宣言を怠ることができます。このような場合、necessaryのようなキーワードを与えることができると思いますが、それは一般的に怠zyでずさんな練習と見なされ、コード全体で使用することは望ましくありませんが、このような状況に置かれます。何それ

Swiftにはlazy letはありません(定数にはlazyはありません)。

遅延に関するAppleのドキュメント です。

変数と定数に関するApple です。言語リファレンスの Declarations にもう少しあります。

1
hlp

Swift 3でこれを試してください

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

幸運を!

1
S E

の代わりに

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

試してください:

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

これでコンパイルエラーが修正されるはずです!!!

1
Edward Pizzurro