Agradeço a todos que dizem usar tags, mas você realmente precisa estender a classe UIButton e simplesmente adicionar o objeto lá.
As tags são uma maneira impossível de contornar isso. Estenda o UIButton assim (no 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)
}
}
então sua chamada pode ser chamada (NOTE OS dois pontos ":" em 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"
então finalmente pegue tudo aqui
@IBAction func webButtonTouched(_ sender: PassableUIButton) {
print(sender.params["myvalue"] ?? "")
}
Você faz isso uma vez e usa em todo o seu projeto (você pode até fazer a classe filha ter um "objeto" genérico e colocar o que quiser no botão!). Ou use o exemplo acima para colocar um número inesgotável de parâmetros de chave / string no botão. Muito útil para incluir coisas como urls, metodologia de mensagem de confirmação, etc.
Como um aparte, é importante que a SO
comunidade perceba que existe toda uma geração de práticas ruins sendo cortadas e coladas na internet por um número alarmante de programadores que não entendem / não foram ensinados / erraram o ponto de O conceito deobject extensions