titlelabel guidelines color buttons swift button uibutton

guidelines - swift button action



Adjuntar parámetro a button.addAcción de destino en Swift (9)

Estoy tratando de pasar un parámetro adicional a la acción buttonClicked, pero no puedo determinar cuál debería ser la sintaxis en Swift.

button.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)

Cualquier método mi botón:

func buttonClicked(sender:UIButton) { println("hello") }

Alguien tiene alguna idea?

Gracias por tu ayuda.


Agradezco a todos los que dicen usar etiquetas, pero realmente necesitas extender la clase UIButton y simplemente agregar el objeto allí.

Las etiquetas son una manera desesperada alrededor de esto. Extienda el UIButton de esta manera (en Swift 4)

import UIKit class PassableUIButton: UIButton{ var params: Dictionary<String, Any> override init(frame: CGRect) { self.params = [:] super.init(frame: frame) } required init?(coder aDecoder: NSCoder) { self.params = [:] super.init(coder: aDecoder) } }

entonces su llamada puede ser llamada (NOTA: los dos puntos ":" en Selector(("webButtonTouched:")) )

let webButton = PassableUIButton(frame: CGRect(x:310, y:40, width:40, height:40)) webButton.setTitle("Visit",for: .normal) webButton.addTarget(self, action: #selector(YourViewController.webButtonTouched(_:)), for:.touchUpInside) webButton.params["myvalue"] = "bob"

entonces finalmente atraparlo todo aquí

@IBAction func webButtonTouched(_ sender: PassableUIButton) { print(sender.params["myvalue"] ?? "") }

Haga esto una sola vez y úselo a lo largo de su proyecto (¡incluso puede hacer que la clase infantil tenga un "objeto" genérico y coloque lo que quiera en el botón!). O utilice el ejemplo anterior para poner un número inagotable de parámetros de clave / cadena en el botón. Muy útil para incluir cosas como URL, confirmar metodología de mensaje, etc.

Por otro lado, es importante que la comunidad SO se de cuenta de que hay una generación entera de malas prácticas que son cortadas por Internet por un alarmante número de programadores que no entienden / no han sido enseñados / se saltaron el punto del concepto de object extensions de object extensions


En Swift 3 crea un selector como ese:

button.addTarget(self, action: #selector(ViewController.multipleParamSelector(_:secondParams:)), for: .touchUpInside)

Y atrapa el evento de esa manera:

func multipleParamSelector(_ sender: AnyObject, secondParams: AnyObject) { }


No puede pasar parámetros personalizados en addTarget: alternativa es establecer la propiedad de tag del botón y hacer el trabajo según la etiqueta.

button.tag = 5 button.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)

O para Swift 2.2 y superior:

button.tag = 5 button.addTarget(self,action:#selector(buttonClicked), forControlEvents:.TouchUpInside)

Ahora haga lógica en función de la propiedad de la tag

@objc func buttonClicked(sender:UIButton) { if(sender.tag == 5){ var abc = "argOne" //Do something for tag 5 } print("hello") }


Para Swift 3.0 puede usar lo siguiente

button.addTarget(self, action: #selector(YourViewController.YourMethodName(_:)), for:.touchUpInside) func YourMethodName(_ sender : UIButton) { print(sender.tag) }


Si desea enviar parámetros adicionales al método buttonClicked, por ejemplo, indexPath o urlString, puede crear una subclase de UIButton:

class subclassedUIButton: UIButton { var indexPath: Int? var urlString: String? }

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 sender.indexPath utilizando sender.indexPath o sender.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).


Código de Swift 3.0

self.timer = Timer.scheduledTimer(timeInterval: timeInterval, target: self, selector:#selector(fetchAutocompletePlaces(timer:)), userInfo:[textView.text], repeats: true) func fetchAutocompletePlaces(timer : Timer) { let keyword = timer.userInfo }

Puede enviar valor en ''userinfo'' y usarlo como parámetro en la función.


Código de Swift 4.0 (Aquí vamos de nuevo)

La acción llamada debería marcarse de esta manera porque esa es la sintaxis de la función swift para exportar funciones al lenguaje objetivo c.

@objc func deleteAction(sender: UIButton) { }

crea un botón de trabajo:

let deleteButton = UIButton(type: .roundedRect) deleteButton.setTitle("Delete", for: []) deleteButton.addTarget(self, action: #selector( MyController.deleteAction(sender:)), for: .touchUpInside)


Para Swift 2.X y superior

button.addTarget(self,action:#selector(YourControllerName.buttonClicked(_:)), forControlEvents:.TouchUpInside)


Si tiene un bucle de botones como yo, puede intentar algo como esto

var buttonTags:[Int:String]? // can be [Int:Any] let myArray = [0:"a",1:"b"] for (index,value) in myArray { let button = // Create a button buttonTags?[index] = myArray[index] button.tag = index button.addTarget(self, action: #selector(buttonAction(_:)), for: .touchDown) } @objc func buttonAction(_ sender:UIButton) { let myString = buttonTags[sender.tag] }