以编程方式将 UITapGestureRecognizer 添加到 Outlet 集合中的 UIViews

Posted

技术标签:

【中文标题】以编程方式将 UITapGestureRecognizer 添加到 Outlet 集合中的 UIViews【英文标题】:Programmatically Adding UITapGestureRecognizer To UIViews in Outlet Collection 【发布时间】:2018-02-11 03:26:28 【问题描述】:

我正在处理存储在插座集合中的一系列视图。

@IBOutlet var theViews: [UIView]!

在我的 viewDidLoad 函数中,我循环遍历视图集合,在此期间我创建了一个 UITapGestureRecognizer 并将其添加到视图中。

for v in theViews 
    let tap = UITapGestureRecognizer(target: self, action: #selector(self.flipSingleView(sender:)))
    tap.delegate = self
    tap.numberOfTapsRequired = 1
    tap.numberOfTouchesRequired = 1
    v.addGestureRecognizer(tap)
    v.isUserInteractionEnabled = true

这里是选择器指向的函数:

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

补充说明:

为这些视图启用了用户交互 flipSingleView 内部的断点永远不会到达 View Controller 实现 UIGestureRecognizerDelegate(我查看了协议,没有看到在这种情况下有用的函数) 已验证所有有问题的视图都与插座集合有插座连接 控制台不会打印任何内容

【问题讨论】:

你的代码没问题。我在模拟器上试了一下,效果很好。确保父视图也有isUserInteractionEnabled = true 【参考方案1】:

你提到你的观点在一个出口集合中,所以我假设它看起来像这样:

@IBOutlet var myViews: [UIView]!

不确定您是否需要投入其中的所有东西。试试这个:

// In viewDidLoad
myViews.forEach view in
  let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap(gesture:)))
  tap.numberOfTapsRequired = 1
  tap.delegate = self
  view.addGestureRecognizer(tap)

对于您的处理程序:

  @objc func handleTap(gesture: UIGestureRecognizer) 
    print("tap")
  

最后,为委托方法添加一个部分,即使它只是空的:

extension ViewController: UIGestureRecognizerDelegate 
  // TODO: Fill in as needed

要确定是哪个视图发送的,您可以在视图中添加标签。

【讨论】:

您完全正确地删除了行设置 tap.numberOfTouchesRequired。知道这是什么原因吗?是不是触碰冲突? 文档中的 var numberOfTouchesRequired: Int 说:“要识别手势所需的手指数量”。我只是盯着它,觉得它看起来很奇怪。 numberOfTouchesRequired 已经默认为一次触摸,因此您无需指定它,除非它不是一次。 因为它默认为1,我看不出将它设置为1 有什么伤害。 OP 的代码在我尝试时有效。 你是对的。我只是看了一下他正在尝试做的事情,看起来代码很多,所以我尝试删除冗余代码。他的问题听起来可能是编译器的侥幸之类的。我认为我不应该得到答案:) 很可能是这样。今天早上我检查了其余的代码,并确认我唯一更改的是前面提到的设置所需触摸计数的行,只是为了查看我是否无意中进行了另一个导致修复的更改。话虽如此,实现此功能的视图都没有在更改之前和之后注册触摸,它们都注册了触摸并打印到控制台。编译器问题与否,感谢两位的帮助!

以上是关于以编程方式将 UITapGestureRecognizer 添加到 Outlet 集合中的 UIViews的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将按钮添加到导航栏

如何以编程方式将空间添加到任务控制?

以编程方式将“测试版”apk 升级为“生产”

如何以编程方式将 Google Sheet 脚本发布/部署为 API 可执行文件?

如何以编程方式将 selectableItemBackground 添​​加到 ImageButton?

以编程方式将网页 HTM 保存为文本文件