NotificationCenter操作堆叠在彼此的顶部?

时间:2016-11-06 20:35:35

标签: swift uigesturerecognizer nsnotificationcenter

我有来自Firebase的用户帖子的按钮。

当viewAppears我正在重新绘制圆圈以使其与信息保持同步。但是,每次我重新绘制圆圈时,都会通过在调用操作的次数上加1来搞乱我与按钮关联的操作。

我有一个类,负责将操作添加到按钮上。

 override init(frame: CGRect) {
        super.init(frame: frame)
 let doubleTap = UITapGestureRecognizer(target: self, action: #selector(self.doubleTapAction(sender:)))
self.addGestureRecognizer(doubleTap)

}
func doubleTapAction(sender : UIButton) {
        print("Double tapped")
        NotificationCenter.default.post(name: .didDoubleTap , object: nil, userInfo: ["tagTapped" : self.tag])
    }

所以代码都是从我的“buttonPost”类中​​完成的。

然后在我的mainVC上,我在viewDidLoad中为.didDoubleTap添加NotificationCenter的观察者

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

最后我有一个处理我想要它做的事情的函数:

 func didDoubleTapOnACircle(sender: Notification) {
        print("double tapped action called")
 }

当我第一次加载页面按钮时,正在发生的事情正在被吸引并且正常工作。如果我在一个圆圈上进行双击,我会从我的类函数中获得“双击”,并从我的观察者函数中获得“双击动作”。

问题是当我离开负责绘制圆圈的视图控制器然后我回到它“didDoubleTapOnCircle”被调用两次,“双击动作”被打印两次,但“双击”被打印一次。如果我要离开并返回主页面(又称重画圈子10次),“双击动作”将打印10次,“双击”仍然会被调用一次。

造成这种情况的原因是什么?我不明白为什么如果我离开视图控制器然后再回来我没有在旧的按钮上方绘制重复按钮,但是手势识别器动作从最后一次被绘制时被堆叠在彼此的顶部。< / p>

所以tl; dr是我将来自firebase的用户帖子表示为可以在首页上重叠的按钮。当我最初在按钮中加载完美时,doubletapp动作会被调用一次。每次我离开并返回按钮页面时,调用didDoubleTapOnCircle函数的次数增加1。

1 个答案:

答案 0 :(得分:0)

我需要删除通知的观察者。我假设是因为我正在重新绘制按钮,这不是必要的,但删除观察者解决了这个问题。

Apple建议在viewWillAppear / Dissapear中处理观察者监听器。

 override func viewWillAppear(_ animated: Bool) {
        NotificationCenter.default.addObserver(self, selector: #selector(self.handleTapped(sender:)), name: .didTap , object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(self.didDoubleTapOnACircle(sender:)), name: .didDoubleTap , object: nil)
    }

    override func viewWillDisappear(_ animated: Bool) {


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


}