Swift: addGestureRecognizer для класса UIView

Я использую этот код:

class StarClass: UIView {
    @IBOutlet weak var bgStar: UIView!

    class func createMyClassView() -> StarClass {
        let myClassNib = UINib(nibName: "Star", bundle: nil)

        let nW = myClassNib.instantiate(withOwner: nil, options: nil)[0] as! StarClass
        nW.bgStar.layer.cornerRadius = 15

        nW.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleStar(sender:))))

        return nW
    }

    @objc func handleStar(sender: UITapGestureRecognizer) {
        print("iosLog STAR")
    }
}

После запуска, если я щелкнул представление, я получаю сообщение об ошибке ниже:

2018-07-10 11:11:50.496349+0430 Ma[23098:89853] +[Ma.StarClass handleStarWithSender:]: нераспознанный селектор отправлен в класс 0x10ef5cac0 2018-07-10 11:11:50.513392+0430 Ma[23098:89853 ] * Завершение работы приложения из-за необработанного исключения 'NSInvalidArgumentException', причина: '+[Ma.StarClass handleStarWithSender:]: нераспознанный селектор отправлен в класс 0x10ef5cac0' * Стек вызовов первого броска:...


person Computer Im    schedule 10.07.2018    source источник
comment
Это выглядит правильно. Вы можете попытаться разделить эту строку на две отдельные строки: 1) let tap = UITap... и 2) nW.add...(tap). Я обнаружил, что иногда это не работает должным образом, если делать это в одной строке.   -  person LinusGeffarth    schedule 10.07.2018
comment
похоже, что действие неправильно прикреплено к xib. Перейдите в xib, откройте левую вкладку, перейдите к самой левой кнопке (там вы видите все ссылки на быстрые файлы). Удалить действие один. Повторная ссылка.   -  person regina_fallangi    schedule 10.07.2018
comment
Ваш код отлично работает для меня. Вроде дело не в коде...   -  person Ahmad F    schedule 10.07.2018


Ответы (1)


Кажется, есть проблема со строкой:

nW.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleStar(sender:))))

Здесь внутри функции class self относится к типу класса, а не к его объекту. Но вы добавляете распознаватель жестов к объекту. Решение здесь будет заключаться в следующем:

nW.addGestureRecognizer(UITapGestureRecognizer(target: nW, action: #selector(handleStar(sender:))))
person avismara    schedule 10.07.2018
comment
благодарю вас. У меня есть еще один вопрос. я установил тег для родительского представления, но функция не возвращает тег. let view = StarClass.createMyClassView() view.tag = index. @objc func handleStar(sender: UITapGestureRecognizer) { print("iosLog STAR \(sender.view?.superview?.tag)") } вернуть ноль! - person Computer Im; 10.07.2018
comment
Потому что вы, кажется, устанавливаете тег представления, но пытаетесь получить тег его родителя? - person avismara; 10.07.2018
comment
Да, я хочу получить родительский тег. как я могу ? - person Computer Im; 10.07.2018
comment
view.superview.tag = х? - person avismara; 10.07.2018
comment
благодарю вас. я установил значение в тег sender.view?.superview?.tag = (sender.view?.tag)!. но вернуть 0 из класса - person Computer Im; 10.07.2018