Swift UITapGestureRecognizer 未按预期工作

Posted

技术标签:

【中文标题】Swift UITapGestureRecognizer 未按预期工作【英文标题】:Swift UITapGestureRecognizer not working as intended 【发布时间】:2016-12-27 19:11:10 【问题描述】:

我有一个简单的UITapGestureRecognizer 并在其相应的方法中插入了一个打印语句。以下是我写的代码:

let tap = UITapGestureRecognizer(target: self, action: #selector(self.segmentTapped(sender:)))
tap.numberOfTapsRequired = 1
self.segmentedControl.addGestureRecognizer(tap)

上面的代码在viewDidLoad 方法中执行。

另外,它的目标方法是:

func segmentTapped(sender: UITapGestureRecognizer) 
    print("called")

该程序存在的问题是,只有当segmentedControl 被点击两次 时,“被调用”一词才会在控制台中打印。如果只是轻按一次,则不会打印出来。我对为什么会发生这种情况感到困惑,因为我已将手势的 numberOfTapsRequired 属性设置为 1。

【问题讨论】:

segmentedControl 是什么类型?它的名称中包含“控制”这一事实让我认为其他东西可能正在捕捉手势 这是因为分段控件有自己的手势来处理您对其部分按钮的点击。 Doug,我正在使用一个名为 KMSegmentedControl 的第三方库。图书馆链接:cocoapods.org/pods/KMSegmentedControl 如果您想使用该分段控件,那么只需添加目标操作来处理点击。 在您提供的链接中,有一个委托“func KMSegmentedControl(selected item: UIButton)”,您可以在其中处理这些点击 【参考方案1】:

因为您使用 segmentedControl 来执行所需的操作。您可以对 segmentedControl 使用操作,而不是为 segmentedControl 添加 GestureRecognizer。就像:

@IBAction func segmentControlValueChanged(_ sender: UISegmentedControl) 

if segmentControl.selectedSegmentIndex == 0 
   print("called")
    else 
    // do something else
 

你甚至可以使用

self.yourSegmentedControl.addTarget(self, action:#selector(segmentTapped(_:)), forControlEvents: .ValueChanged)

func segmentTapped(sender: UISegmentedControl)
 
   print("called")
// Do what you want

【讨论】:

以上是关于Swift UITapGestureRecognizer 未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

swift [Swift Notes]在学习Swift #Swift的同时收集笔记

Swift 反射

Swift入门系列--Swift官方文档(2.2)--中文翻译--About Swift 关于Swift

swift 示例BS swift.swift

swift swift_bug.swift

ios 整理(一)swift和oc的区别