Прикрепите параметр к кнопке.действие addTarget в Swift
Я пытаюсь передать дополнительный параметр в действие buttonClicked, но не могу понять, какой синтаксис должен быть в Swift.
button.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)
любой мой метод buttonClicked:
func buttonClicked(sender:UIButton)
{
println("hello")
}
у кого-нибудь есть идеи?
Спасибо за вашу помощь.
9 ответов:
вы не можете передать параметры в
addTarget:.Один из вариантов-установить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свойства@objc func buttonClicked(sender:UIButton) { if(sender.tag == 5){ var abc = "argOne" //Do something for tag 5 } print("hello") }
Если вы хотите отправить дополнительные параметры в метод buttonClicked, например indexPath или urlString, вы можете подкласс UIButton:
class subclassedUIButton: UIButton { var indexPath: Int? var urlString: String? }обязательно измените класс кнопки в инспекторе идентификации на subclassedUIButton. Вы можете получить доступ к параметрам внутри метода buttonClicked с помощью
sender.indexPathилиsender.urlString.Примечание: Если ваша кнопка находится внутри ячейки, вы можете установить значение этих дополнительных параметров в cellForRowAtIndexPath метод (где создается кнопка).
Я ценю, что все говорят использовать теги, но на самом деле вам нужно расширить класс 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) } }тогда ваш вызов может быть вызовом (обратите внимание на двоеточие": "in
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"] ?? "") }вы делаете это один раз и использовать его на протяжении всего проекта (вы даже можете сделать дочерний класс есть общий "объект" и положить все, что вам нравится в кнопку!). Или используйте приведенный выше пример, чтобы поместить в кнопку неисчерпаемое количество параметров ключа/строки.. Действительно полезно для включения таких вещей, как URL-адреса, подтверждение методологии сообщений и т. д.
в стороне, это важно, что
SOсообщество понимает, что существует целое поколение плохой практики, которая вырезается из интернета тревожным количеством программистов, которые не понимают/не были обучены/пропущены суть понятияobject extensions
в Swift 3 сделать селектор так:
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) }
Если у вас есть цикл кнопок, как я вы можете попробовать что-то вроде этого
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] }
Swift 4.0 код (здесь мы идем снова)
вызываемое действие должно быть помечено так, потому что это синтаксис функции swift для экспорта функций в язык objective c.
@objc func deleteAction(sender: UIButton) { }создать некоторые рабочие кнопки:
let deleteButton = UIButton(type: .roundedRect) deleteButton.setTitle("Delete", for: []) deleteButton.addTarget(self, action: #selector( MyController.deleteAction(sender:)), for: .touchUpInside)
Для Swift 2.X и выше
button.addTarget(self,action:#selector(YourControllerName.buttonClicked(_:)), forControlEvents:.TouchUpInside)
Swift 3.0 code
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' и использовать его в качестве параметра в функции.
Comments