#swift #xcode #uibutton #selector
#swift #xcode #uibutton #селектор
Вопрос:
У меня есть функция для создания пользовательской кнопки в моем проекте Swift, где я передаю имя селектора функций objc, но при нажатии на кнопку происходит сбой кода. Может ли кто-нибудь указать, почему мой код выходит из строя? Я получаю сообщение об ошибке: Unrecognized selector [TwitterTutorial.Utilities handleDontHaveAnAccountButtonClicked]
Вот моя пользовательская функция кнопки:
class Utilities {
static func createCustomButton(withFirstPart first: String, andSecondPart second: String, andSelector selector: Selector) -> UIButton {
let button = UIButton(type: .system)
let attributedTitle = NSMutableAttributedString(string: first,
attributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 16),
NSAttributedString.Key.foregroundColor: UIColor.white])
attributedTitle.append(NSAttributedString(string: second,
attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 16),
NSAttributedString.Key.foregroundColor: UIColor.white]))
button.setAttributedTitle(attributedTitle, for: .normal)
button.addTarget(self, action: selector, for: .touchUpInside)
return button
}
}
и вот вызов функции для создания кнопки:
private let dontHaveAccountButton = Utilities.createCustomButton(withFirstPart: "Don't have an account? ",
andSecondPart: "Sign Up",
andSelector: #selector(handleDontHaveAnAccountButtonClicked))
@objc func handleDontHaveAnAccountButtonClicked() {
print("DEBUG: Don't have an account button clicked")
}
Я заметил, что это работает, когда я удаляю ключевое слово static из объявления метода класса, но я хотел бы использовать статические методы в своих классовых утилитах.
Ответ №1:
Вы установили значение target
self
, означающее, что метод селектора должен быть объявлен в Utilities
.
Возможные решения
- Добавьте параметр
target
в метод. - Расширить
UIButton
. - Расширить
UIViewController
или тип, в котором создается кнопка. - Объявите метод селектора в
Utilities
(не имеет особого смысла).
Комментарии:
1. Спасибо, я добавил дополнительный параметр для цели
Ответ №2:
Вы используете статическую функцию для создания кнопки, и при вызове
button.addTarget(self, action: selector, for: .touchUpInside)
self
относится к классу Utilities
, а не к экземпляру.
Следовательно, селектор также должен ссылаться на функцию класса (например, статическую), например
@objc static func handleDontHaveAnAccountButtonClicked() {
print("DEBUG: Don't have an account button clicked")
}
Комментарии:
1. Спасибо за предложение, но мой код по-прежнему выходит из строя с той же ошибкой, что и раньше. Однако, когда я передаю цель и использую это для установки цели в методе button .addTarget (), это работает.