Swift: завершающее приложение UITapGestureRecognizer для класса пера - PullRequest
0 голосов
/ 13 июня 2018

Я создаю класс пера:

import UIKit

class AlertController: UIView {
    @IBOutlet weak var back: UIView!
    @IBOutlet weak var viewMain: UIView!

    class func createAlert() -> AlertController {
        let myNib = UINib(nibName: "Alert", bundle: nil)
        let nib = myNib.instantiate(withOwner: nil, options: nil)[0] as! AlertController

        nib.back.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleBack(sender:))))

        return nib
    }

    @objc func handleBack(sender: UITapGestureRecognizer) {
        //viewMain.isHidden = true
        print("LogIos => X")
    }
}

И использую его в другом классе:

let view = AlertController.createAlert()
viewMain.addSubview(view)

Это прекрасно работает, но если я нажимаю back button, я получаю ошибку ниже:

2018-06-13 12: 28: 03.958448 + 0430 Mat [50493: 243526] *** Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «+ [Mat.AlertController handleBackWithSender:]: нераспознанный селектор отправлен в класс 0x104db4e90 '

Но если я использую приведенный ниже код, все работает нормально:

@IBAction func xxx(_ sender: Any) {
    print("LogIos => Y")
}

Я хочу использовать UITapGestureRecognizer, потому что я использую View дляпользовательская кнопка

1 Ответ

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

Хотя я не понимаю, что вы имеете в виду под «func xxx отлично работает» (чего не должно быть, если вы используете тот же код, что и выше), проблема в том, что:

  • createAlert является статической (class) функцией
  • Внутри
    • вы создаете экземпляр nib вашего AlertController
    • ваш #selector относится к selfв данном случае это класс , а не экземпляр
  • Следовательно, распознаватель жестов относится к статической (class) функции handleBack - который вы можете увидеть, если внимательно посмотреть на + знак в тексте исключения:

    причина: '+ [Mat.AlertController handleBackWithSender:]: нераспознанный селектор

  • Следовательно, либо сделайте handleBack статическим (class func), либо предоставьте экземпляр в качестве цели (что, как я предположил бы, вы хотите)

Так что

nib.back.addGestureRecognizer(UITapGestureRecognizer(target: nib, action: #selector(handleBack(sender:))))

должно работать на вас.

Замечание

Тем не менее, позвольте мне дать вам подсказку по дизайну: Althoтьфу вы называете это AlertController, это не контроллер представления, а UIView - это сбивает с толку.Вы должны четко разделить представление и контроллер, а также указать, какие из этих ручек какие.

...