Переключатель действия кнопки быстрого доступа при касании из другого класса: нераспознанный селектор, отправленный экземпляру - PullRequest
0 голосов
/ 19 сентября 2018

В UIViewController (мой BaseViewController ниже) я добавляю подпредставление всплывающего диалогового окна (из другого класса NotifDialog), содержащего кнопку.

Эта кнопка должна скрывать всплывающее диалоговое окно при касании.

Моя проблема в том, что либо кнопка не обнаруживает касание, либо выдает «нераспознанный селектор, отправленный экземпляру»

class NotifDialog: NSObject {
    var dialogView: UIView!

    superView = controller.view
    dialogView = UIView()        

    superView?.addSubview(dialogView)
    dialogView.translatesAutoresizingMaskIntoConstraints = false

    let dialogViewWidth = BaseViewController.screenWidth * 0.66
    let dialogViewHeight = BaseViewController.screenHeight * 0.45

    dialogView.centerXAnchor.constraint(equalTo: (superView?.safeAreaLayoutGuide.centerXAnchor)!).isActive = true
    dialogView.centerYAnchor.constraint(equalTo: (superView?.safeAreaLayoutGuide.centerYAnchor)!).isActive = true
    dialogView.widthAnchor.constraint(equalToConstant: dialogViewWidth).isActive = true
    dialogView.heightAnchor.constraint(equalToConstant: dialogViewHeight).isActive = true        

    let bClose = UIButton()

    dialogView?.addSubview(bClose)

    bClose.translatesAutoresizingMaskIntoConstraints = false

    let bCloseWidth = dialogViewWidth * 0.5

    bClose.centerXAnchor.constraint(equalTo: dialogView.safeAreaLayoutGuide.centerXAnchor).isActive = true
    bClose.topAnchor.constraint(equalTo: dialogView.topAnchor, constant: 25).isActive = true
    bClose.widthAnchor.constraint(equalToConstant: bCloseWidth).isActive = true
    bClose.heightAnchor.constraint(equalToConstant: 25).isActive = true

    //bClose.addTarget(controller, action:#selector(self.hide(_:)), for: .touchUpInside) -> touch not detected
    //bClose.addTarget(self, action:#selector(self.closeDialog(_:)), for: .touchUpInside) -> throws error "unrecognized selector sent to instance"

}

func closeDialog(_ sender : UIButton) {
    dialogView.isHidden = true
}

.

class BaseViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    let topViewController :UIViewController = self.navigationController!.topViewController!
    let dialog = NotifDialog()
    dialog.loadCustomViewIntoController(controller: topViewController)
}

Установка моей кнопкиследующий способ делает его как не обнаруженное касание

bClose.addTarget(self, action:#selector(closeDialog(_:)), for: .touchUpInside)

Установка моей кнопки следующим образом обнаруживает касания, но выдает ошибку: «нераспознанный селектор отправлен на экземпляр»

bClose.addTarget(controller, action:#selector(closeDialog(_:)), for: .touchUpInside)

Наконец, ятакже попытался сделать мою функцию closeDialog статической.В этом случае он больше не падает, однако я не могу использовать dialogView в нем, так как этот var не является статическим.

Как скрыть диалог от прикосновения к этой кнопке?

1 Ответ

0 голосов
/ 19 сентября 2018

Сообщение closeDialog отправляется адресату, указанному вами в вызове addTarget.Поскольку метод closeDialog существует в классе NotifDialog, вам необходимо сделать экземпляр NotifDialog целевым.

bClose.addTarget(
    dialog, // This is the instance that will receive the message
    action:#selector(closeDialog(_:)),
    for: .touchUpInside
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...