我有一个DotBoss:UIViewController
场景中有十几个UIView,Dot:UIView
(有些是直接的子视图,有些是向下的子视图。)
在最高控制器和点项目之间的链中甚至有容器视图。
十几个点项目知道他们是否被窃听。。。
class Dot:UIView
{
private var tap:UITapGestureRecognizer? = nil
override func awakeFromNib()
{
tap = UITapGestureRecognizer(target:self,
action: #selector(SnapDot.handleTap(_:)))
self.addGestureRecognizer(tap!)
}
func handleTap(g:UITapGestureRecognizer)
{
print("user tapped on this particular Dot...")
}
}
我想知道其中一个被点击的时间。
class DotBoss:UIViewController
{
func oneDotWasClicked(d:Dot)
{
}
}
如何在迅捷中做到完美?
注意,对于任何在这里搜索的人来说,这个冒泡扩展非常有用:https://blog.veloxdb.com/2016/05/12/bubbling-events-using-uiresponder-in-swift/
最佳答案
点(UIView)和它的最终控制点老板(UIViewController)都是响应者,并且是响应者链上的链接。因此,点可以通过遍历响应程序链来调用其DotBoss中的方法,直到它到达DotBoss:
func handleTap(g:UITapGestureRecognizer) {
// ... other stuff can go here if necessary ...
var r : UIResponder = self
repeat { r = r.nextResponder()! } while !(r is DotBoss)
(r as! DotBoss).oneDotWasClicked(self)
}