Прикрепите параметр к кнопке.действие addTarget в Swift



Я пытаюсь передать дополнительный параметр в действие buttonClicked, но не могу понять, какой синтаксис должен быть в Swift.



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


любой мой метод buttonClicked:



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


у кого-нибудь есть идеи?



Спасибо за вашу помощь.

960   9  

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

    Ничего не найдено.