离开并返回查看后两次调用手势识别器代码

Posted

技术标签:

【中文标题】离开并返回查看后两次调用手势识别器代码【英文标题】:Gesture recognizer code being called twice after leaving and coming back to view 【发布时间】:2017-01-17 01:14:51 【问题描述】:

页面加载时,我在视图上创建了一些按钮。

在我看来DidAppear 我有

    NotificationCenter.default.addObserver(self, selector: #selector(self.didDoubleTapOnACircle(sender:)), name: .didDoubleTap , object: nil)

这些正在侦听视图的自定义类中设置的通知。例如:

 func doubleTapAction(sender : UIButton) 

    print("Double tapped")

    NotificationCenter.default.post(name: .didDoubleTap , object: nil, userInfo: ["tagTapped" : self.tag])

然后我得到了

    let doubleTap = UITapGestureRecognizer(target: self, action: #selector(self.doubleTapAction(sender:)))
    doubleTap.numberOfTapsRequired = 2
    self.addGestureRecognizer(doubleTap)

所以这一切都适用于初始加载。在我的主视图中,当我双击其中一个视图时,我得到的函数运行一次,并且完全符合预期。这段代码已经工作了几个月,如果我离开并返回页面,它会突然开始运行两次。我离开和回来多少次都没关系,它最多只能跑两次。

令人困惑的是,在我的 doubleTapAction 中,我打印了“双击”),但在我的 mainVC didDoubleTapOnACircle 函数中,我有一个打印输出,并且打印了两次。手势识别器仅被“识别”一次,但实际函数被调用两次。

在我看来WillDissapear 我有

NotificationCenter.default.removeObserver(self, name: .didDoubleTap, object: nil)

这发生在我的每一个手势识别器功能上。页面第一次加载,全部运行一次。如果我离开,它们都会开始运行两次,但实际类的函数(如 doubleTapAction)的打印输出会打印一次。

有什么想法吗?

【问题讨论】:

可能是因为你 addObserver 两次(addObserver 在你里面viewDidAppear)? 使用Cmd + Shift + F 查找didDoubleTap 短语的所有项目,看看您是否为该键添加了两次观察者 【参考方案1】:

将点击手势代码移动到viewDidLoad 而不是viewDidAppear

let doubleTap = UITapGestureRecognizer(target: self, action: #selector(self.doubleTapAction(sender:)))
doubleTap.numberOfTapsRequired = 2
self.addGestureRecognizer(doubleTap)

viewDidAppear 将在您每次返回该屏幕时被调用。当您移动到不同的屏幕时,您无需移除手势识别器 - 只有在该视图可见时才会调用它们。

【讨论】:

以上是关于离开并返回查看后两次调用手势识别器代码的主要内容,如果未能解决你的问题,请参考以下文章

iOS >> 如何识别用户离开 UISlider Thumb 属性的手势?

如何识别调用了哪个点击手势识别器?

在 iOS 7 中操作手势识别器

如何添加 UILongPressGestureRecognizer 释放功能

为啥我的平移手势只能在第二次输入后识别事件?

为啥我的 watchkit 应用程序没有在“开始”状态调用我的平移手势识别器处理代码?