ここに私の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).
メソッドの名前に括弧を追加するだけです。
また、リンクを参照することもできます: タイプ 'CustomButton'の値にはメンバー 'touchDown'がありません
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で試してください
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)
}
Swift 3ではこれを使用します-
object?.addTarget(objectWhichHasMethod, action: #selector(classWhichHasMethod.yourMethod), for: someUIControlEvents)
たとえば(私のコードから)-
self.datePicker?.addTarget(self, action:#selector(InfoTableViewCell.datePickerValueChanged), for: .valueChanged)
パラメーターとして送信者が必要な場合は、メソッド名の後に:
を指定します。
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 です。言語リファレンスの Declarations にもう少しあります。
Swift 3でこれを試してください
button.addTarget(self, action:#selector(ClassName.handleRegister(sender:)), for: .touchUpInside)
幸運を!
の代わりに
let loginRegisterButton:UIButton = {
//... }()
試してください:
lazy var loginRegisterButton:UIButton = {
//... }()
これでコンパイルエラーが修正されるはずです!!!