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

Estoy tratando de pasar un parámetro adicional a la acción buttonClicked, pero no puedo determinar cuál debería ser la syntax 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.

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

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).

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

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

 import UIKit class PassableUIButton: UIButton{ var params: Dictionary 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 progtwigdores 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) { } 

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 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] } 

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

La acción llamada debería marcarse de esta manera porque esa es la syntax de la función swift para exportar funciones al lenguaje objective 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) 

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.