with ios swift selector

ios - with - Cómo usar el método addTarget en swift 3



swift 4 selector syntax (9)

aquí está mi objeto de 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 }()

y aquí está mi función

func handleRegister(){ FIRAuth.auth()?.createUser(withEmail: email, password: password,completion: { (user, error) in if error != nil { print("Error Occured")} else {print("Successfully Authenticated")} }) }

Recibo un error de compilación, si addTarget lo eliminó, se compila correctamente


El segundo comentario del cartel del 21 de septiembre es perfecto. Para aquellos que pueden llegar a este hilo más tarde con el mismo problema que el póster, aquí hay una breve explicación. Es bueno tener en cuenta las otras respuestas, pero no abordan el problema común que encuentra este código.

En Swift, las declaraciones hechas con la palabra clave let son constantes. Por supuesto, si fuera a agregar elementos a una matriz, la matriz no puede declararse como una constante, pero un control segmentado debería estar bien, ¿verdad? No si hace referencia al control segmentado completado en su declaración.

Al hacer referencia al objeto (en este caso un UISegmentedControl , pero esto también sucede con UIButton ) en su declaración cuando dice .addTarget y deja que el objetivo sea self , las cosas se bloquean. ¿Por qué? Porque el self está en medio de ser definido. Pero sí queremos definir el comportamiento como parte del objeto ... Declararlo perezosamente como una variable con var . El lazy engaña al compilador para que piense que self está bien definido: silencia a su compilador de que le importe en el momento de la declaración. Las variables declaradas perezosamente no se establecen hasta que se llaman por primera vez. Entonces, en esta situación, lazy te permite usar la noción de self sin problemas mientras configuras el objeto, y luego cuando tu objeto obtiene un .touchUpInside o .valueChanged o lo que sea tu tercer argumento en tu .addTarget() , LUEGO llama en la noción de self , que en ese momento está completamente establecida y totalmente preparada para ser un objetivo válido. Entonces te permite ser flojo al declarar tu variable. En casos como estos, creo que podrían darnos una palabra clave como necessary , pero generalmente se ve como una práctica perezosa y descuidada y no desea usarla en todo su código, aunque puede tener su lugar en este tipo de situación. Que es

No hay lazy let en Swift (no hay lazy para las constantes).

Aquí está la documentación de Apple sobre perezoso .

Aquí está la Apple sobre variables y constantes . Hay un poco más en su Referencia del lenguaje en Declarations .


En swift 3 usa esto:

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

Por ejemplo (de mi código) -

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

Simplemente proporcione un : después del nombre del método si desea que el remitente sea el parámetro.


En vez de

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

Tratar:

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

¡Eso debería solucionar el error de compilación!


Probar con 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) }



Prueba esto con Swift 3

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

¡Buena suerte!


Sí, no agregue "()" si no hay parámetro

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

y si quieres obtener el remitente

button.addTarget(self, action:#selector(handleRegister(_:)), for: .touchUpInside). func handleRegister(sender: UIButton){ //... }

Editar:

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

ya no funciona, debe reemplazar _ en el selector con un nombre de variable que utilizó en el encabezado de la función, en este caso sería sender , por lo que el código de trabajo se convierte en:

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


Prueba esto con 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(){ //... }


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) { }