Swift3 iOS - 如何使 UITapGestureRecognizer 触发功能

Swift3 iOS - How to make UITapGestureRecognizer trigger function

我正在尝试将 UITapGesture 添加到 UIButton,以便在点击时触发功能。我正在使用 Swift 3 并出现一些错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[SwiftRunner.ViewController tapBlurButton]: unrecognized selector sent to instance 0x149e07610'

我的大概是这样的:

// Swift 3
import UIKit
class ViewController {

   @IBOutlet weak var qsBlurButton: UIButton!       

   override func viewDidLoad() {
      super.viewDidLoad()

      let tapGesture = UITapGestureRecognizer(target: self, action: Selector(("tapBlurButton")))
      qsBlurButton.addGestureRecognizer(tapGesture)
   }

   func tapBlurButton(sender: UITapGestureRecognizer) {
      print("Please Help!")
   }
}

根据您的代码,您使用的是 swift 3.0,因此请像这样更改 selector 语法

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tapBlurButton(_:)))

你的函数是这样的

func tapBlurButton(_ sender: UITapGestureRecognizer) {
    print("Please Help!")
}

编辑:

不知道您正在使用带点击手势的按钮,而不是使用内置方法 addTarget 按钮无需像这样为其创建点击手势

qsBlurButton.addTarget(self, action: #selector(self.tapBlurButton(_:)), forControlEvents: .TouchUpInside)

func tapBlurButton(_ sender: UIButton) {
    print("Please Help!")
}

Swift 3

如果选择器的 func 看起来像这样(注意:它没有 _):

func tapBlurButton(sender: UITapGestureRecognizer) {
  print("Please Help!")
}

然后选择器看起来像这样:

#selector(self.tapBlurButton(sender:))

所以选择器的最终代码是这样的:

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tapBlurButton(sender:)))

如果不指定第一个参数有_,那么需要使用第一个参数的全名

要添加手势识别器,您必须创建一个指示它将调用哪个函数的识别器:

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.handleTapFrom(recognizer:)))

然后将其添加到您需要的元素中。 (您正在使用一个按钮,正如其他人所解释的那样,按钮具有其本机 'addTarget' 方法)

出于解释的目的,假设您想将其添加到 UIView:

self.someView.addGestureRecognizer(tapGestureRecognizer)

并且不要忘记某些元素默认为 "not user interactive",因此您可能还需要更改 属性:

self.someView.isUserInteractionEnabled = true

In Swift 4 函数需要@objc 声明:

@objc func handleTapFrom(recognizer : UITapGestureRecognizer)
{
    // Some code...
}