Estoy tratando de pasar un parámetro adicional a la acción buttonClicked, pero no puedo averiguar cuál debería ser la sintaxis en Swift.
button.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)
Cualquiera de mi método buttonClicked:
func buttonClicked(sender:UIButton)
{
println("hello")
}
¿Alguien alguna idea?
Gracias por tu ayuda.
WARNING TO INTERNET: please check out my answer at the bottom
Respuestas:
No puede pasar parámetros personalizados en
addTarget:
. Una alternativa es establecer latag
propiedad del botón y hacer el trabajo basado en la etiqueta.O para Swift 2.2 y superior:
Ahora haz la lógica basada en la
tag
propiedadfuente
Int
. Nada más.Si desea enviar parámetros adicionales al método buttonClicked, por ejemplo, indexPath o urlString, puede crear una subclase del UIButton:
Asegúrese de cambiar la clase del botón en el inspector de identidad a subclassedUIButton. Puede acceder a los parámetros dentro del método buttonClicked usando
sender.indexPath
osender.urlString
.Nota: Si su botón está dentro de una celda, puede establecer el valor de estos parámetros adicionales en el método cellForRowAtIndexPath (donde se crea el botón).
fuente
Aprecio que todos digan que use etiquetas, pero realmente necesita extender la clase UIButton y simplemente agregar el objeto allí ...
Las etiquetas son una forma desesperada de evitar esto. Extienda el UIButton así (en Swift 4)
entonces su llamada puede ser llamada (NOTA LOS dos puntos ":" en
Selector(("webButtonTouched:"))
)luego, finalmente, cógelo todo aquí
Puede hacer esto una vez y usarlo en todo su proyecto (¡incluso puede hacer que la clase secundaria tenga un "objeto" genérico y poner lo que quiera en el botón!). O use el ejemplo anterior para poner una cantidad inagotable de parámetros de clave / cadena en el botón. Realmente útil para incluir cosas como URL, confirmar metodología de mensajes, etc.
Aparte, es importante que la
SO
comunidad se dé cuenta de que hay toda una generación de malas prácticas que están siendo cortadas y pegadas en Internet por un número alarmante de programadores que no entienden / no se les ha enseñado / han perdido el punto de el concepto deobject extensions
fuente
Para Swift 3.0 puede usar lo siguiente
fuente
Rápido 4.2
Resultado:
En el archivo
UIButton+Events.swift
, he creado un método de extensión paraUIButton
vincularUIControl.Event
a un controlador de finalización llamadoEventHandler
:La razón por la que utilicé una clase personalizada para vincular el evento es poder eliminar la referencia más adelante cuando se desintializa el botón. Esto evitará que se produzca una posible pérdida de memoria. Esto no fue posible dentro de
UIButton
su extensión, porque no puedo implementar una propiedad ni eldeinit
método.fuente
Si tienes un bucle de botones como yo, puedes probar algo como esto
fuente
Código Swift 4.0 (aquí vamos de nuevo)
La acción llamada debe marcarse así porque esa es la sintaxis de la función rápida para exportar funciones al lenguaje objetivo c.
crear algún botón de trabajo:
fuente
Código Swift 5.0
Yo uso theButton.tag pero si tengo muchas opciones, es una caja de cambio muy larga.
.
fuente
Para Swift 2.X y superior
fuente
Código Swift 3.0
Puede enviar valor en 'userinfo' y usarlo como parámetro en la función.
fuente
Este es un comentario más importante. Compartir referencias de sytanx que son aceptables desde el primer momento. Para soluciones de pirateo, busque otras respuestas.
Según los documentos de Apple, las definiciones de métodos de acción deben ser una de estas tres. Cualquier otra cosa no se acepta.
fuente