UITapGestureRecognizer静态方法崩溃

Bol*_*ion 0 ios uitapgesturerecognizer uicollectionviewcell swift

我有一个带有多个custom UICollectionViewCell的快捷应用程序。所有细胞都有多个对象(无论是UIImageViewUILabel),用户可以点击(因此,我使用多个UITapGestureRecognizers到调用相应的行动。现在,为了减轻我的工作,使代码少重复,我想创造一个extensionUITapGestureRecognizerstatic我可以直接在类上调用的方法。

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

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() {
    }
}
Run Code Online (Sandbox Code Playgroud)

控制台错误说:

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

CZ5*_*Z54 5

问题似乎在这里: 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
}
Run Code Online (Sandbox Code Playgroud)