Я пытаюсь передать дополнительный параметр действию buttonClicked, но не могу понять, какой синтаксис должен быть в Swift.
button.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)
Любой мой метод buttonClicked:
func buttonClicked(sender:UIButton)
{
println("hello")
}
У кого-нибудь есть идеи?
Спасибо за вашу помощь.
WARNING TO INTERNET: please check out my answer at the bottom
Ответы:
Вы не можете передавать пользовательские параметры в.
addTarget:
Одна альтернатива - установитьtag
свойство кнопки и работать на основе тега.Или для Swift 2.2 и выше:
Теперь выполните логику на основе
tag
свойстваисточник
Int
. Ничего больше.Если вы хотите отправить дополнительные параметры методу buttonClicked, например indexPath или urlString, вы можете создать подкласс UIButton:
Обязательно измените класс кнопки в инспекторе удостоверений на subclassedUIButton. Вы можете получить доступ к параметрам внутри метода buttonClicked с помощью
sender.indexPath
илиsender.urlString
.Примечание. Если ваша кнопка находится внутри ячейки, вы можете установить значение этих дополнительных параметров в методе cellForRowAtIndexPath (где создается кнопка).
источник
Я ценю всех, кто говорит об использовании тегов, но на самом деле вам нужно расширить класс UIButton и просто добавить туда объект.
Теги - безнадежный способ обойти это. Расширьте UIButton следующим образом (в Swift 4)
тогда ваш звонок может быть call (ЗАПОМНИТЕ Двоеточие ":" в
Selector(("webButtonTouched:"))
)тогда, наконец, поймай все это здесь
Вы делаете это один раз и используете в своем проекте (вы даже можете сделать дочерний класс общим «объектом» и поместить все, что хотите, в кнопку!). Или используйте приведенный выше пример, чтобы поместить в кнопку неисчерпаемое количество параметров ключа / строки. Действительно полезно для включения таких вещей, как URL-адреса, методика подтверждения сообщений и т. Д.
Кроме того, важно, чтобы
SO
сообщество осознало, что существует целое поколение плохой практики, которую вырезают в Интернете тревожным числом программистов, которые не понимают / не учили / не понимают сути Концепция чего-либоobject extensions
источник
Для Swift 3.0 вы можете использовать следующие
источник
Swift 4.2
Результат:
В этом файле
UIButton+Events.swift
я создал метод расширения,UIButton
который связывает aUIControl.Event
с обработчиком завершения, который называетсяEventHandler
:Причина, по которой я использовал настраиваемый класс для привязки события, заключается в том, чтобы иметь возможность удалить ссылку позже, когда кнопка будет деинициализирована. Это предотвратит возможную утечку памяти. Это было невозможно в
UIButton
его расширении, потому что мне не разрешено реализовывать свойство илиdeinit
метод.источник
Если у вас есть петля кнопок, как у меня, вы можете попробовать что-то вроде этого
источник
Код Swift 4.0 (здесь мы снова)
Вызываемое действие должно быть помечено таким образом, потому что это синтаксис быстрой функции для экспорта функций в целевой язык c.
создать рабочую кнопку:
источник
Код Swift 5.0
Я использую theButton.tag, но если у меня много вариантов, это будет очень длинный случай переключения.
.
источник
Для Swift 2.X и выше
источник
Код Swift 3.0
Вы можете отправить значение в userinfo и использовать его как параметр в функции.
источник
Это более важный комментарий. Совместное использование ссылок на sytanx, что допустимо из коробки. Чтобы найти решения для взлома, посмотрите другие ответы.
Согласно документам Apple, определения методов действий должны быть одним из этих трех. Все остальное не принимается.
источник