UITapGestureRecognizer 静态方法崩溃

Posted

技术标签:

【中文标题】UITapGestureRecognizer 静态方法崩溃【英文标题】:UITapGestureRecognizer static method crashes 【发布时间】:2018-07-05 14:19:08 【问题描述】:

我有一个带有多个自定义UICollectionViewCells 的快速应用程序。所有单元格都有多个用户可以点击的对象(UIImageViewUILabel)(因此,我使用多个UITapGestureRecognizers 来调用相应的操作。现在,为了减轻我的工作并减少代码重复,我想创建一个 UITapGestureRecognizerextensionstatic 方法,我可以直接在类上调用。

我做到了,但应用程序崩溃的事实意味着我做的不好。这是我的代码:

extension UITapGestureRecognizer 
    static func addNewTapGuestureRecognizer(for imageView: UIImageView, selectorName: Selector) 
        let tap = UITapGestureRecognizer(target: self, action: selectorName)
        imageView.addGestureRecognizer(tap)
        imageView.isUserInteractionEnabled = true
    

    static func addNewTapGuestureRecognizer(for label: UILabel, selectorName: Selector) 
        let tap = UITapGestureRecognizer(target: self, action: selectorName)
        label.addGestureRecognizer(tap)
        label.isUserInteractionEnabled = true
    


class TextCVC: UICollectionViewCell 

    override func awakeFromNib() 
        super.awakeFromNib()
        addTapGuesturesForImagesAndLabels()
    

    func addTapGuesturesForImagesAndLabels() 
        UITapGestureRecognizer.addNewTapGuestureRecognizer(for: postActionShareImageVIew, selectorName: #selector(self.shareImageTapped))
        UITapGestureRecognizer.addNewTapGuestureRecognizer(for: postActionLikeImageVIew, selectorName: #selector(self.likeImageTapped))
    

    @objc func shareImageTapped() 
        print("share")
    

    @objc func likeImageTapped() 
    

控制台错误提示:

由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'+[UITapGestureRecognizer likeImageTapped]: 无法识别的选择器发送到类 0x1b52e4c50'

【问题讨论】:

【参考方案1】:

问题似乎在这里: let tap = UITapGestureRecognizer(target: self, action: selectorName)

目标不是self,是UICollectionViewCell的实例。

将您的代码更改为:

static func addNewTapGuestureRecognizer(for imageView: UIImageView, target: Any, selectorName: Selector) 
    let tap = UITapGestureRecognizer(target: target, action: selectorName)
    imageView.addGestureRecognizer(tap)
    imageView.isUserInteractionEnabled = true

【讨论】:

【参考方案2】:

问题出在目标所以替换这个

 static func addNewTapGuestureRecognizer(for imageView: UIImageView, selectorName: Selector) 

static func addNewTapGuestureRecognizer(for imageView: UIImageView, selectorName: Selector , myTarget:UICollectionViewCell) 

     let tap = UITapGestureRecognizer(target: myTarget, action: selectorName)


 

【讨论】:

以上是关于UITapGestureRecognizer 静态方法崩溃的主要内容,如果未能解决你的问题,请参考以下文章

UITapGestureRecognizer 不适用于 UIView 动画

使用 UITapGestureRecognizer 无法识别的选择器

UIlabel 中的 UITapGestureRecognizer 错误

UITapGestureRecognizer 的问题

带有点击事件的 UITapGestureRecognizer

UIButton 上的 UITapGestureRecognizer