将参数附加到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.indexPath
或sender.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'中发送值,并将其用作函数中的参数。