Добавление цели к кнопке программным способом выдает ошибку «нераспознанный селектор отправлен в класс» - PullRequest
0 голосов
/ 03 июня 2018

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

Вот мой код:

let sendButton: UIButton = {
        let button = UIButton(type: .system)
        button.setTitle("Send", for: .normal)
        button.setTitleColor(UIColor.white, for: .normal)
        button.backgroundColor = #colorLiteral(red: 0.5098039216, green: 0.5215686275, blue: 0.8392156863, alpha: 1)
        button.layer.cornerRadius = 5
        button.isUserInteractionEnabled = true
        button.addTarget(self, action: #selector(postComment), for: .touchUpInside)
        return button
    }()

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

На самом деле все зависит от времени.Вы объявляете свойство экземпляра вместе с функцией define-and-call, которая инициализирует это свойство, и вы продолжаете говорить button.addTarget(self... в этой функции.Тогда возникает вопрос: когда будет выполняться код этой функции?Невероятно, но это очень важно, настолько, что фактически меняет значение self.

Когда вы говорите let, чтобы сделать это объявление, код запускается в тот момент, когда экземпляр еще несуществовать.Пример именно то, что мы находимся в процессе формирования в тот момент;это еще не "приготовлено".Фактически, без вашего ведома, self в этот момент означает класс UIButton! Следовательно, полученное целевое действие недопустимо;у вас нет метода класса postComment;это метод экземпляра (правильно).И так позже, когда вы нажимаете кнопку, и мы пытаемся сказать postComment классу, мы терпим крах.«Нераспознанный селектор отправлен в класс», в точности как вы говорите.

С другой стороны, когда вы говорите lazy var, код не вызывается до тех пор, пока экземпляр self не существует, self означаетпример, и все хорошо.

Это ужасно смущает начинающих и не очень начинающих;даже указав на проблему, я сам совершил точно такую ​​же ошибку.По моему мнению, компилятор должен поймать это и остановить вас, но это не так.Я подал ошибку: http://bugs.swift.org/browse/SR-4865

0 голосов
/ 03 июня 2018

Я на самом деле только что понял.

По какой-то причине, замена 'let' на 'lazy var', кажется, помогает.Я не могу объяснить, почему это работает, но это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...