【问题标题】:Swift3 iOS - How to make UITapGestureRecognizer trigger functionSwift3 iOS - 如何制作 UITapGestureRecognizer 触发功能
【发布时间】:2016-08-08 12:24:01
【问题描述】:

我正在尝试将UITapGesture 添加到 UIButton,以便在点击时触发一个功能。我正在使用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!")
   }
}

【问题讨论】:

  • 如果你想使用 UIButton 触发一个函数,那么你也可以使用 qsBlurButton.addTarget(target: self, action: ":FuncName", forControlEvents: TouchUpInside)

标签: ios swift uigesturerecognizer swift3


【解决方案1】:

从您的代码中您使用的是 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!")
}

【讨论】:

  • 好的,我试过了,但我仍然遇到同样的错误。还收到警告“没有使用 Objective-C 选择器 'tapBlurButton:' 声明的方法”
  • @Sebbe 您需要将 @objc 属性放在选择器方法上。 @objc func tapBlurButton() ....
  • 试着用我的来改变你的函数声明。
  • 谢谢,这两天我一直在寻找新的 Swift 3.0 选择器语法。
  • @NiravD 谢谢!我只是想让它与 Swift 3 一起使用!
【解决方案2】:

斯威夫特 3

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

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

那么选择器是这样的:

#selector(self.tapBlurButton(sender:))

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

    self.someView.addGestureRecognizer(tapGestureRecognizer)
    

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

    self.someView.isUserInteractionEnabled = true
    

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

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

    【讨论】:

    • 在 Swift 4 中,函数需要 @objc 声明。为什么?
    • 因为在 Swift 3 中它是自动“推断”的。然而在 Swift 4 中它不再是了。 @objc 用于向 Objective-C 运行时公开方法。这个函数是通过使用“选择器”来调用的,这是一个 Objective-C 的特性,因此你必须用这个关键字来公开它。
    猜你喜欢
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    相关资源
    最近更新 更多