【问题标题】:UITapGestureRecognizer unrecognized selector sent to instanceUITapGestureRecognizer 无法识别的选择器发送到实例
【发布时间】:2014-09-21 04:40:20
【问题描述】:

我已经搜索了这个问题的解决方案,但在我的情况下找不到任何似乎可以解决这个问题的方法。我从 UITapGestureRecognizer 得到了上述异常。

这是简化的代码:

import UIKit;

class ViewController : UIViewController, UIScrollViewDelegate
{
    @IBOutlet weak var scrollView:UIScrollView!;
    var imageView:UIImageView!;

    override func viewDidLoad()
    {
        super.viewDidLoad();

        ... set up imageView/scrollView here ...

        let doubleTapRecognizer = UITapGestureRecognizer(target: self, action: "onScrollViewDoubleTapped");
        doubleTapRecognizer.numberOfTapsRequired = 2;
        doubleTapRecognizer.numberOfTouchesRequired = 1;
        scrollView.addGestureRecognizer(doubleTapRecognizer);
    }


    func onScrollViewDoubleTapped(recognizer:UITapGestureRecognizer)
    {
    }
}

谁能告诉我这段代码有什么问题?这对我来说似乎都是正确的。我怀疑它与将 ViewController 指定为 scrollView 的委托有关(反之亦然)?但是 ViewController 被设置为 scrollView 的委托。但也许是其他原因导致了这个错误?

【问题讨论】:

    标签: ios swift selector uitapgesturerecognizer


    【解决方案1】:

    尝试在选择器字符串中添加一个冒号。

    let doubleTapRecognizer = UITapGestureRecognizer(target: self, action: "onScrollViewDoubleTapped:");
    

    正如 cabellicar123 提到的,这表明选择器接受一个参数。

    【讨论】:

    • 为了进一步解释,: 表示它正在等待一个参数。
    • 啊哈!谢谢,这解决了它!不知道结肠。
    【解决方案2】:

    也可以尝试在你的方法中添加一个参数:

    ...(target: self, action: "yourMethodName:")
    
    func yourMethodName(sender: AnyObject?)
    {
        println("Clicked yourMethodName")
    }
    

    【讨论】:

      【解决方案3】:

      也许可以帮助某人:我遇到了这个错误,因为我将选择器方法声明为私有:

      func setup() {
        let singleFingerTap = UITapGestureRecognizer(target: self, action: "didTapOnViewInteraction:")
        singleFingerTap.numberOfTapsRequired = 1
        self.viewInteraction.addGestureRecognizer(singleFingerTap)
      }
      
      private func didTapOnViewInteraction(recognizer: UITapGestureRecognizer) {
      
      }
      

      删除“私人”关键字,一切都很好!

      【讨论】:

        【解决方案4】:

        Swift 4 使用 #selector

        let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didSelectItem(sender:)))
        
        @objc func didSelectItem(sender: AnyObject?) {
            print("didSelectItem: \(sender)")
        }
        

        【讨论】:

          【解决方案5】:

          对于 Swift 4

          override func viewDidLoad() {
                  super.viewDidLoad()
          
              let tap = UITapGestureRecognizer(target: self, action: #selector(SignUpViewController.click))
              userImage.addGestureRecognizer(tap)
              userImage.isUserInteractionEnabled = true
          }
          
          @objc func click()
          {
              print("Tapped on Image")
          }
          

          其中 SignUpViewController 是您的视图控制器名称

          【讨论】:

            【解决方案6】:

            在我的例子中,使用 Swift 4,选择器被正确定义,但由于带有手势的项目位于集合视图中,因此导致找不到选择器。我实现了一个自定义单元格并在其中配置了选择器

            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "recent", for: indexPath) as! MyCollectionViewCell
            
            cell.configureGestureWith(entry: recentEntries.sorted(by: {$0.createdAt > $1.createdAt})[indexPath.row], sender: self)
            

            希望这对某人有所帮助。

            【讨论】:

              猜你喜欢
              • 2013-10-09
              • 1970-01-01
              • 2019-08-28
              • 2012-07-24
              相关资源
              最近更新 更多