Почему я получаю сообщение об ошибке «нераспознанный селектор» в моей консоли отладки Xcode

#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 (), это работает.