swift UITapGestureRecognizer 不在视图上工作

Posted

技术标签:

【中文标题】swift UITapGestureRecognizer 不在视图上工作【英文标题】:swift UITapGestureRecognizer not working on view 【发布时间】:2017-11-15 00:33:09 【问题描述】:

我不得不创建一个新线程,因为它让我发疯,并且所有其他在线答案都完全相同。我已经这样做了无数次,但我看不到我一生中缺少什么。我使用“测试”视图控制器只是为了让点击手势工作,但它根本不起作用......我相当确定我设置正确,因为这就是我一直在实现它的方式过去:(是的,我已选中 isUserInteractionEnabled 框)。我什至以这种确切的方式在不同的视图控制器上实现它并且它正在工作......

class TestViewController: UIViewController 

  override func viewDidLoad() 
    super.viewDidLoad()
    view.addGestureRecognizer(tap)
  

  let tap = UITapGestureRecognizer(target: self, action: #selector(wasTapped))

    
  @objc func wasTapped() 
    print("tapped")
  

我也尝试将参数添加到 wasTapped:

@objc func wasTapped(gestureRecognizer: UITapGestureRecognizer) 
  print("tapped")

【问题讨论】:

【参考方案1】:

你是说:

override func viewDidLoad() 
    super.viewDidLoad()

    view.addGestureRecognizer(tap)


let tap = UITapGestureRecognizer(target: self, action: #selector(wasTapped))

问题出在最后一行:

let tap = UITapGestureRecognizer(target: self, action: #selector(wasTapped))

你不能像在茫茫荒野中那样说let tap。您正在隐式创建实例属性。但是您不能使用self 的目标来初始化实例属性,因为在初始化实例属性时self 不存在。 (我认为该代码甚至可以编译为错误,并已将其报告为错误。)

将该行移至viewDidLoad 的开头,如下所示:

override func viewDidLoad() 
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: #selector(wasTapped))
    view.addGestureRecognizer(tap)

【讨论】:

虽然第一个答案也是正确的,但我选择这个是因为解释。我想知道为什么,而不仅仅是如何。这是完全有道理的,我觉得不考虑这个很傻。谢谢。 @matt 作为目标需要一个 Any?是不是“self”在这里指的是视图控制器类型而不是实例? @jeh 在“buggy”版本中,OP 在视图控制器的顶层显示 let tapyes,这正是 self 的结果意思是。这就是问题所在。【参考方案2】:

试试这样的

override func viewDidLoad() 
    super.viewDidLoad()

     let tap = UITapGestureRecognizer(target: self, action: #selector(wasTapped(sender:)))
     tap.numberOfTapsRequired = 1 // Default value
     view.isUserInteractionEnabled = true
     view.addGestureRecognizer(tap)



@objc func wasTapped(sender: UITapGestureRecognizer) 
    print("tapped")

【讨论】:

【参考方案3】:

如果您想为标准UIView's 使用手势识别器,您必须启用交互

在您的viewDidLoad 中添加view.isUserInteractionEnabled = true。

【讨论】:

【参考方案4】:
var tapGesture = UITapGestureRecognizer()

查看并设置 IBOutlet 如下:

@IBOutlet weak var viewTap: UIView!     

viewDidLoad() 上写漂亮的代码,比如:

tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.myviewTapped(_:)))
tapGesture.numberOfTapsRequired = 1
tapGesture.numberOfTouchesRequired = 1
viewTap.addGestureRecognizer(tapGesture)
viewTap.isUserInteractionEnabled = true

当点击手势识别时调用此方法:

@objc func myviewTapped(_ sender: UITapGestureRecognizer) 
  if self.viewTap.backgroundColor == UIColor.yellow 
    self.viewTap.backgroundColor = UIColor.green
  else
    self.viewTap.backgroundColor = UIColor.yellow
  

【讨论】:

以上是关于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的区别