将参数附加到Swift中的button.addTarget动作

我想传递一个额外的参数到buttonClicked操作,但不能算出什么语法应在Swift中。

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

任何我buttonClicked方法:

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

任何任何想法?

谢谢你的帮助。

您不能在addTarget:传递自定义参数addTarget: 。另一种方法是设置button的tag属性,并根据标签进行工作。

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

或者对于Swift 2.2和更高版本:

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

现在做基于tag属性的逻辑

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

如果你想发送额外的参数到buttonClicked方法,例如indexPath或urlString,你可以inheritanceUIButton:

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

确保将标识检查器中的button类更改为subclassedUIButton。 您可以使用sender.indexPathsender.urlString访问buttonClicked方法中的参数。

注意:如果您的button位于单元格内,您可以在cellForRowAtIndexPath方法(创buildbutton的位置)中设置这些附加参数的值。

在Swift 3中做一个这样的select器:

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

赶上这样的事件:

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

对于Swift 3.0,您可以使用以下内容

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

对于Swift 2.X及以上版本

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

如果你有像我这样的button循环,你可以尝试这样的事情

 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) } func buttonAction(_ sender:UIButton) { let myString = buttonTags[sender.tag] } 

Swift 4.0代码(这里我们再去)

被调用的行为应该标记为这样

 @objc func deleteAction(sender: UIButton) { } 

创build一些工作button:

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

真的,你需要扩展UIButton类,并简单地添加对象

我感谢大家说使用标签,但这是一个无望的方式。 像这样扩展UIButton(在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) } } 

那么你的电话可能会被调用(注意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" 

那么最后在这里抓住这一切

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

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 } 

您可以在'userinfo'中发送值,并将其用作函数中的参数。