Аргумент '#селектор' не относится к '@язык' метод, свойство или инициализатор

Я sublcassed в Свифт 3 в UIButton подкласс, который написан на Objective-С.

Когда я пытаюсь добавить цель, она завершается с кодом ошибки:

class ActionButton: JTImageButton {

    func action() {

    }

    func configure()) {
        // ...
        self.addTarget(self, action: #selector(self.action()), for: .touchUpInside)
        // error: 
        // Argument of '#selector' does not refer to an '@objc' method, property, or initializer

    }
}
Комментарии к вопросу (1)

Проблема в том, что в #селектора(самовыдвижение.действие()), самостоятельно.действие () - это HTTP, то call_. Вы Don'т хотите call метод; вы хотите name метод. Сказать `#селектора(действий) вместо: потерять скобки, плюс там's нет необходимости в "я".

Комментарии (5)
Решение

Все, что вам нужно сделать, это пометить функцию как `@взаимодействию и там's нет необходимости ссылаться на " Я " или скобочки

class ActionButton: JTImageButton {

    @objc func btnAction() {

    }

    func configure() {
        // ...
        self.addTarget(self, action: #selector(btnAction), for: .touchUpInside)
        // error: 
        // Argument of '#selector' does not refer to an '@objc' method, property, or initializer

    }
}

Вы даже можете сделать это "частный", если вы хотите

Комментарии (4)

Добавление ключевого слова@взаимодействию в передней метод, который идеально подходит, но у меня все еще есть эта ошибка. Наконец, я нашел решение следующим образом

Есть пара лишних скобок за метод, как показано на фото выше. Что я должен сделать, это удалить его, и он работал хорошо.

Комментарии (2)

Добавлено из комментариев на другой ответ: функции действия() это не просто плохой выбор для имени функции и действия, он не сможет построить. (Вы можете использовать его в качестве параметра функции входного сигнала, хотя, который я делаю для наглядности при прохождении в целевой/действия в методе init (), которая устанавливает эти вещи.) Я'м замена этого с MyAction() для ясности.


Попробуйте это:

self.addTarget(self, action: #selector(MyAction), for: .touchUpInside)

Тот сказал, гораздо лучше дизайн, чтобы переместить MyAction() функция кнопки суперпанель, поскольку это делает вещи более выравниваются с базового проектирования MVC:

Суперпанель:

let myButton = ActionButton()
// include other button setup here
myButton.addTarget(self, action: #selector(MyAction), for: .touchUpInside

func action(_ sender: ActionButton) {
    // code against button tap here
}

Альтернативой кодирования для этого, удерживая "в действии () на" метод в-представление-контроллер, но подвижным только в "addTarget" и в кнопку:

self.addTarget(superview?, action(superview?.MyAction), for: .touchUpInside)

Почему я прошу Вас рассмотреть вопрос о переходе в "MyAction () на" Метод суперпанель? Двоякой:

  • Он контролирует не только кнопка, но и все остальные подпанелей в нем's вид, и они часто взаимодействуют друг с другом через контроллер представления.
  • Это делает кнопка гораздо более многоразовые в других сценариях.
Комментарии (0)

Вместо того чтобы сказать "я".действие(), ActionButton использовать.действие()`.

Комментарии (0)

Если вы Don'т ум добавления дополнительной функции, вы могли бы вложить функцию.

self.addTarget(self, action: myAction, for: UIControlledEvent)

myAction(){
    @obj.methodYouWantToCall(//parameters//)
}
Комментарии (0)