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
button.addTarget(self, action:#selector(handleRegister()), for: .touchUpInside).
Simplemente agregue paréntesis con el nombre del método.
También puede referir el enlace: El valor del tipo ''CustomButton'' no tiene miembro ''touchDown''
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) {
}