2017-01-17 4 views
0

Ich habe Schaltflächen, die ich in meiner Ansicht erstelle, wenn die Seite geladen wird.Gestenerkenner-Code wird nach dem Verlassen und Zurückkommen zweimal aufgerufen.

In meinem viewDidAppear Ich habe

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

Diese werden hören Benachrichtigungen nach Ansicht der benutzerdefinierten Klasse einrichten. Zum Beispiel:

func doubleTapAction(sender : UIButton) { 

    print("Double tapped") 

    NotificationCenter.default.post(name: .didDoubleTap , object: nil, userInfo: ["tagTapped" : self.tag]) 
} 

und dann habe ich diese

let doubleTap = UITapGestureRecognizer(target: self, action: #selector(self.doubleTapAction(sender:))) 
    doubleTap.numberOfTapsRequired = 2 
    self.addGestureRecognizer(doubleTap) 

So alle Arbeiten auf Vorlast bekam. In meiner Hauptansicht, wenn ich auf eine dieser Ansichten doppelklicke, läuft die Funktion, die ich habe, einmal und genau das, was erwartet wird. Dieser Code hat schon seit Monaten funktioniert und aus dem Nichts ist er zweimal gestartet, wenn ich gehe und auf die Seite zurückkomme. Es spielt keine Rolle, wie oft ich gehe und zurückkomme, es endet beim Laufen zweimal.

Was ist verwirrend ist in meiner doubleTapAction Ich habe den Ausdruck von "Double angetippt", aber in meiner Funktion rufe ich meine MainVC didDoubleTapOnACircle, ich habe einen Ausdruck und das wird zweimal gedruckt. Der Gestenerkenner wird nur einmal "erkannt", aber die eigentliche Funktion wird zweimal aufgerufen.

In meinem viewWillDissapear Ich habe

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

Dies geschieht bei jedem einzelnen meiner Gestenerkenner Funktionen. Die Seite lädt zum ersten Mal, es läuft alles einmal. Wenn ich gehe, fangen sie alle zweimal an zu laufen, aber der Ausdruck auf der tatsächlichen Klassenfunktion wie doubleTapAction wird einmal gedruckt.

Irgendwelche Ideen?

+0

vielleicht ist es, weil Sie addObserver zweimal (addObserver ist in Ihnen ** viewDidAppear **)? –

+0

Verwenden Sie 'Cmd + Shift + F', um alle Projekte für' didDoubleTap' zu finden und sehen Sie, ob SieObserver zweimal für diesen Schlüssel hinzufügen – t4nhpt

Antwort

2

den Code Tippgeste in viewDidLoad bewegen und nicht viewDidAppear

let doubleTap = UITapGestureRecognizer(target: self, action: #selector(self.doubleTapAction(sender:))) 
doubleTap.numberOfTapsRequired = 2 
self.addGestureRecognizer(doubleTap) 

viewDidAppear wird jedes Mal, wenn Sie zu diesem Bildschirm zurück aufgerufen werden. Sie müssen die Gestenerkenner nicht entfernen, wenn Sie zu einem anderen Bildschirm wechseln - sie werden nur aufgerufen, wenn diese Ansicht sichtbar ist.

Verwandte Themen