2016-11-06 10 views
0

Firebaseのユーザー投稿を表すボタンがあります。NotificationCenterのアクションは、互いのオンタップを積み重ねていますか?

私はサークルを再描画して情報を最新の状態に保ちます。しかし、サークルを再描画するたびに、アクションが呼び出された時間に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に私は

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

のviewDidLoad

に.didDoubleTapための通知センターのためのオブザーバーを追加しているし、最終的に私はそれがやりたいと思ってるものを扱うその機能を持っている:

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

何が起こっているのかは、ページボタンが最初に読み込まれて描画されているときに動作するときです。私がサークル上でダブルタップすると、私のクラス関数からの "ダブルタップ"とオブザーバ関数からの "ダブルタップアクション"の両方が得られます。

問題は、サークルの描画を担当しているビューコントローラを離してから、「didDoubleTapOnCircle」が2回呼び出されるときです。「ダブルタップアクション」は2回出力されますが、「ダブルタップ」は取得されます。一度プリントアウト。私が出発してメインページ(サークルを10回書き直す)に戻った場合、「ダブルタップド・アクション」は10回印刷され、「ダブルタップ」は1回と呼ばれます。

この原因は何ですか?なぜ私がビューコントローラを離れて戻ってくるのかわからないのですが、重複したボタンが古いものの上に描かれているのではないのですが、ジェスチャ認識器のアクションは最後に描画された時から重ねて重ねて表示されます。

だから、私は最初のページでダブルタップできるボタンとしてfirebaseのユーザー投稿を表しています。私が最初にボタンをロードすると、ボタンが完全に機能するので、ダブルタブのアクションは1回だけ呼び出されます。私が離してボタンページに戻るたびに、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) 


} 
関連する問題