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

Gesture recognizer code being called twice after leaving and coming back to view

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

在我看来我有

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

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

 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)

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

令人困惑的是在我的 doubleTapAction 中我有 "Double tapped") 的打印输出,但在我的函数中我在我的 mainVC didDoubleTapOnACircle 中调用,我有一个打印输出并且打印了两次。手势识别器仅获得 "recognized" 一次,但实际功能被调用了两次。

在我看来WillDissapear我有

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

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

有什么想法吗?

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

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

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