以编程方式将 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的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式将 Google Sheet 脚本发布/部署为 API 可执行文件?