2016-11-06 142 views
0

我有一些代表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.default.addObserver(self, selector: #selector(self.didDoubleTapOnACircle(sender:)), name: .didDoubleTap , object: nil) 

最后我具备的功能来处理,我想它做的事:

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

发生了什么事情是当我第一次加载页面按钮正在绘制和工作,因为他们应该。如果我在一个圆圈上双击,我会从我的班级功能中获得“双击”,并从我的观察员功能中获得“双击动作”。

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

这是什么造成的?我不明白为什么如果我离开视图控制器并回来,我没有得到重复的按钮被绘制在旧的按钮上方,但手势识别器的动作从最后一次被吸入时叠加在彼此的顶部。

因此,tl; dr是我代表用户从firebase发布的帖子,作为可以在首页上重复出现的按钮。当我最初加载按钮的工作完美时,doubletapp操作被称为一次。每次离开并返回到按钮页时,调用didDoubleTapOnCircle函数的次数增加1.

回答

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) 


}