当我尝试将 TapGestureRecognizer 添加到我的 UIImageView 时出现此错误:Unrecognized selector sent to class

Posted

技术标签:

【中文标题】当我尝试将 TapGestureRecognizer 添加到我的 UIImageView 时出现此错误:Unrecognized selector sent to class【英文标题】:I get this error when I try to add TapGestureRecognizer to my UIImageView : Unrecognized selector sent to class 【发布时间】:2017-01-31 08:45:30 【问题描述】:

我有这个 DiaryCell (collectionviewcell) 类,我正在尝试在该类中添加一个手势识别器来调用另一个类的 collectionViewController 的方法。

class DiaryCell: UICollectionViewCell 
    override init(frame: CGRect) 
        super.init(frame: frame)
        setupViews()
    

    required init(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

    //imageview for favorite button
    let favoriteImageView: UIImageView = 
        let imageView = UIImageView()
        imageView.image = #imageLiteral(resourceName: "favorite_gray")
        imageView.contentMode = .scaleAspectFill
        imageView.clipsToBounds = true
        return imageView
    ()

    //imageview for menu button
    let menuImageView: UIImageView = 
        let imageView = UIImageView()
        imageView.image = #imageLiteral(resourceName: "menu_image")
        imageView.contentMode = .scaleAspectFit
        imageView.clipsToBounds = true
        imageView.isUserInteractionEnabled = true
        imageView.translatesAutoresizingMaskIntoConstraints = false
        return imageView
    ()

我尝试了不同的策略,但我无法将手势识别器添加到 menuImageView。我已经尝试过这样做,其中 HomeCollectionViewController 是我想要在点击图像时处理操作的控制器。

imageView.addGestureRecognizer(UITapGestureRecognizer(target: HomeCollectionViewController.self, action: #selector(HomeCollectionViewController.menuBarPressed))

【问题讨论】:

setupViews() ?这是做什么的。 它为整个单元格设置约束。我不知道为什么我的问题底部的行不起作用。 您是否添加了 TapGestureDelegate。需要设置为HomeCollectionViewController @SachinVas 我不确定你的意思。你能详细说明一下吗?很抱歉,但有时我需要更多信息才能理解某些内容。 let gesture = UITapGestureRecognizer(target: HomeCollectionViewController.self, action: #selector(HomeCollectionViewController.menuBarPressed) gesture.delegate = HomeCollectionViewController.self imageView.addGestureRecognizer(gesture) 【参考方案1】:

问题在于,虽然您的代码是合法且可以编译的,但它是错误的。

您正在将手势设置为发送到类型而不是实例。您需要将目标设置为HomeCollectionViewController的实际实例

实现此目的的一种方法是在单元格中设置对控制器的弱引用。

class DiaryCell: UICollectionViewCell 

    var tapGesture:UITapGestureRecognizer?
    weak var gestureTarget: HomeCollectionViewController? 
        didSet 
            setupGestures()
        
    

    func setupGestures() 

        if let tapGesture = tapGesture 
            removeGestureRecognizer(tapGesture)
            self.tapGesture = nil
        

        if let gestureTarget = gestureTarget 
            let gesture = UITapGestureRecognizer(target: gestureTarget, action: #selector(HomeCollectionViewController.menuBarPressed))
            addGestureRecognizer(gesture)
            tapGesture = gesture
        

    


您可能会在您的collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 方法中设置gestureTarget

虽然这可以解决您的问题,但它不是处理事情的好方法,您应该了解如何使用委托作为编码模式。

【讨论】:

以上是关于当我尝试将 TapGestureRecognizer 添加到我的 UIImageView 时出现此错误:Unrecognized selector sent to class的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我尝试将 rails 更新到 4.0.0 时会发生这种情况?

当我尝试将数据保存在 txt (java) 中时,为啥我会得到这些符号

当我尝试运行颤振项目时将显示此错误

为啥当我尝试将主键设置为无符号时出现 errno150

当我尝试将表单设置为清理时,脏表单给出错误

当我尝试写入文件时,将 JSON 转换为 XML 错误