2016-11-06 2 views
0

Firebase의 사용자 게시물을 나타내는 버튼이 있습니다.NotificationCenter 작업이 서로 ontop을 스태킹합니까?

뷰가 나타나면 정보를 최신 상태로 유지하기 위해 서클을 다시 그려 보겠습니다. 그러나 원을 다시 그릴 때마다 액션이 호출 된 횟수에 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에 대한 NotificationCenter에 대한 관측을 추가 해요 그리고 마지막으로 나는 그것을 할 꿔 무엇을 처리하는 기능을 가지고 :

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

무슨 일이 일어나는지는 처음으로 페이지 버튼을로드하고 그려야하는 시점입니다. 원에서 더블 탭하면 클래스 기능에서 "두 배 탭"되고 내 관찰자 기능에서 "두 번 탭 동작"이라고 표시됩니다.

문제는 원 그리기를 담당하는 viewcontroller를 떠나서 "didDoubleTapOnCircle"이 두 번 호출되면 "double tap 작업"이 두 번 인쇄되지만 "double tapped"는 가져옵니다 한 번 인쇄 해. 나가서 메인 페이지 (원으로 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) 


} 
관련 문제