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

时间:2017-01-17 01:14:51

标签: ios swift uigesturerecognizer

我已经在页面加载时创建了我的视图按钮。

在我看来,我已经有了

    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令人困惑的是我打印了#34; Double tapped"),但在我的功能中,我在我的mainVC中调用了didDoubleTapOnACircle,我已经得到了打印输出并打印两次。手势识别器只能被识别出来#34;一次,但实际的功能被调用两次。

在我看来WillDissapear我有

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

我的每个手势识别器功能都会发生这种情况。页面首次加载,全部运行一次。如果我离开,它们都会开始运行两次,但实际类的函数打印输出就像doubleTapAction一样打印一次。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

let doubleTap = UITapGestureRecognizer(target: self, action: #selector(self.doubleTapAction(sender:)))
doubleTap.numberOfTapsRequired = 2
self.addGestureRecognizer(doubleTap)
每次返回该屏幕时都会调用

viewDidAppear。当您移动到其他屏幕时,您不需要移除手势识别器 - 只有在该视图可见时才会调用它们。