2016-07-11 16 views
7

Funktionieren die neuen Benachrichtigungen derzeit nicht in Swift 3? Ich tue:NSNotifications in Swift 3

NotificationCenter.default().post(name: DidTouchParticleView, 
            object: self.particle as? AnyObject) 

in einer benutzerdefinierten Ansicht des touchesBegan() und ich brauche das particle Objekt an den View-Controller zu senden, wenn es einen gibt. Also ich mache das:

NotificationCenter.default().addObserver(forName: DidTouchParticleView, 
             object: self, 
             queue: OperationQueue.main(), 
             using: presentParticleDisplayView(notification:)) 

in einem View-Controller ViewDidLoad(). Ich bin mir sicher, dass dieser bestimmte Ansicht-Controller der ist, der präsentiert wird, wenn ich auf meine benutzerdefinierte Ansicht tippe, jedoch wird die Funktion presentParticleDisplayView(notification:) nie aufgerufen.

Auch ist DidTouchParticleView global wie folgt definiert:

let DidTouchParticleView = NSNotification.Name("didTouchParticleView") 

Ist dies aufgrund der Beta, oder bin ich etwas falsch?

+0

In der aktuellen Beta und in Swift 3 werden die Klammern nach 'default()' entfernt; Es ist 'NotificationCenter.default'. – matt

Antwort

11

Es klingt, als ob Sie vorhaben, addObserver(_:selector:name:object:) aufzurufen, wo die zweite Parametermeldung (selector:) an den ersten Parameter (das Ziel) gesendet wird.

Stattdessen rufen Sie die falsche Methode addObserver(forName:object:queue:using:) auf, die ganz anders funktioniert.

Auch, wie zum zweiten Teil Ihrer Frage:

let DidTouchParticleView = NSNotification.Name("didTouchParticleView") 

Das ist richtig (fast) ist; es sollte

let DidTouchParticleView = Notification.Name("didTouchParticleView") 

Alle Benachrichtigungsnamen sind jetzt Notification.Name Instanzen sein. Der richtige Weg, dies zu tun, ist zu sagen:

extension Notification.Name { 
    static let didTouchParticleView = Notification.Name("didTouchParticleView") 
} 

Sie dann auf die Mitteilung des Namens als .didTouchParticleView im gesamten Code verweisen.

1

Sie überwachen die Veröffentlichung der Benachrichtigung (object: self). Sie wahrscheinlich so etwas wie object: particle oder möglicherweise object: nil in der addObserver Aufruf bedeuten (aber dann darauf achten, dass es das richtige Teilchen in der Handler ist). Lesen Sie die Dokumentation für diese Methode erneut und beachten Sie sorgfältig, was der Parameter object ist.

Beachten Sie, dass diese Version von addObserver ein Observer-Objekt zurückgibt. Sie müssen das speichern, damit Sie später removeObserver damit aufrufen können.

+0

Das Ändern von 'object' zu nil löst es. Woher weiß es jedoch, was der Beobachter geworden ist? Vorher, in Swift 2, gab es 'addObserver:', das ein Objekt als Beobachter nimmt. –

+1

@YoussefSami Nein, du hast nicht verstanden, was vorher passiert ist. Das Objekt war niemals der Beobachter. Der Beobachter wird vom Anruf zurückgerufen. Verwechseln Sie das nicht mit 'addObserver (_: selector: name: object:) ', wobei der erste Parameter _ist_ der Beobachter ist. Sehen Sie jetzt meine bearbeitete Antwort. – matt

+0

@matt Ja, das ist es, auf das ich mich bezog. Wie weiß das Notification Center nun, an welches Objekt die Benachrichtigung gesendet werden soll? –