Swift3 iOS - 如何制作UITapGestureRecognizer触发器功能

Seb*_*bbe 48 uigesturerecognizer ios swift swift3

我正在尝试添加一个UITapGestureUIButton,以便在点击时触发一个函数.我正在使用Swift 3并且收到一些错误:

由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [SwiftRunner.ViewController tapBlurButton]:无法识别的选择器发送到实例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!")
   }
}
Run Code Online (Sandbox Code Playgroud)

Nir*_*v D 106

从你的代码中使用swift 3.0,所以改变你的selector语法

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tapBlurButton(_:)))
Run Code Online (Sandbox Code Playgroud)

和你的功能一样

func tapBlurButton(_ sender: UITapGestureRecognizer) {
    print("Please Help!")
}
Run Code Online (Sandbox Code Playgroud)

编辑:

不知道你正在使用带有敲击手势的按钮,而不是使用内置addTarget的按钮方法,不需要像这样创建轻击手势

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

func tapBlurButton(_ sender: UIButton) {
    print("Please Help!")
}
Run Code Online (Sandbox Code Playgroud)

  • @Sebbe你需要在你的选择器方法上放置@objc属性.`@objc func tapBlurButton()....` (2认同)
  • 尝试用我的一个更改你的函数声明. (2认同)

sky*_*ook 9

斯威夫特3

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

func tapBlurButton(sender: UITapGestureRecognizer) {
  print("Please Help!")
}
Run Code Online (Sandbox Code Playgroud)

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

#selector(self.tapBlurButton(sender:))
Run Code Online (Sandbox Code Playgroud)

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

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tapBlurButton(sender:)))
Run Code Online (Sandbox Code Playgroud)

如果未指定第一个参数_,则需要使用第一个参数的全名.


Poc*_*chi 6

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

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.handleTapFrom(recognizer:)))
Run Code Online (Sandbox Code Playgroud)

然后将其添加到您需要的元素.(您正在使用按钮,而其他人已解释按钮具有其原生的"addTarget"方法)

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

self.someView.addGestureRecognizer(tapGestureRecognizer)
Run Code Online (Sandbox Code Playgroud)

并且不要忘记默认情况下某些元素"非用户交互",因此您可能也必须更改该属性:

self.someView.isUserInteractionEnabled = true
Run Code Online (Sandbox Code Playgroud)

Swift 4中,该函数需要@objc声明:

@objc func handleTapFrom(recognizer : UITapGestureRecognizer)
{
    // Some code...
}
Run Code Online (Sandbox Code Playgroud)

  • 因为在 Swift 3 中它是自动“推断”的。然而在 Swift 4 中它不再是了。@objc 用于向 Objective-C 运行时公开方法。这个函数是通过使用“选择器”来调用的,它是一个 Objective-C 特性,因此你必须用这个关键字来公开它。 (2认同)