Как подписать метод на нажатие кнопки вне класса, который содержит этот метод? - PullRequest
0 голосов
/ 07 марта 2019

У меня есть SomeViewController с одной кнопкой на виде. В didLoad я добавляю метод из объекта в качестве обработчика касания кнопки следующим образом:

class SomeViewController: UIViewController {

   func didLoad() {
     // ...
     let x = X()
     button.addTarget(self, action: #selector(x.test), 
                      for: UIControl.Event.touchUpInside)
     // ...
   }

   class X {
     @objc func test(sender:UIButton) {
        // ...       
     }
   }

   @objc func test(sender:UIButton) {
       // ...
   }
}

Я новичок в Свифте и не имею опыта работы с Objective-C. Но когда я проверил это прикосновение к кнопке под названием SomeViewController.test, это нарушило мое понимание языков программирования. Для меня это выглядит как ошибка. После удаления SomeViewController.test нажатие кнопки вызвало исключение:

2019-03-07 13: 07: 25.737090 + 0200 myProgram [13570: 283951] - [myProgram.SomeViewController testWithSender:]: нераспознанный селектор отправлен в экземпляр 0x7fbcc9d174d0 2019-03-07

13: 07: 25.745918 + 0200 myProgram [13570: 283951] *** Завершение работы приложения из-за необработанное исключение 'NSInvalidArgumentException', причина: '- [myProgram.SomeViewController testWithSender:]: не распознано селектор отправлен на экземпляр 0x7fbcc9d174d0 '

Каков принцип подписки на событие с помощью оболочки #selector? Как подписать метод на нажатие кнопки вне класса, который содержит этот метод? Если это невозможно - почему?


Свифт 4.2

1 Ответ

1 голос
/ 07 марта 2019

Заменить

button.addTarget(self, action: #selector(x.test), 
                  for: UIControl.Event.touchUpInside)

с

button.addTarget(x, action: #selector(x.test), 
                  for: UIControl.Event.touchUpInside)

Поскольку цель должна содержать реализацию метода селектора, также лучше сделать

let x = X()

переменная экземпляра

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