2016-07-11 48 views
7

Le nuove notifiche non funzionano attualmente in Swift 3? Io sto facendo:NSNotifiche in Swift 3

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

in touchesBegan di una visualizzazione personalizzata() e ho bisogno di inviare l'oggetto particle al controller della vista se ce n'è uno. Così faccio questo:

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

in una vista controller's ViewDidLoad(). Sono certo che quel particolare controller di visualizzazione è quello presentato quando tocco la mia visualizzazione personalizzata, tuttavia, la funzione presentParticleDisplayView(notification:) non viene mai chiamata.

Inoltre, DidTouchParticleView è definito a livello globale in questo modo:

let DidTouchParticleView = NSNotification.Name("didTouchParticleView") 

È questo a causa della versione beta, o sto facendo qualcosa di sbagliato?

+0

Nella versione beta corrente e in Swift 3 in avanti, vengono rimosse le parentesi dopo "default()"; è 'NotificationCenter.default'. – matt

risposta

11

Sembra che si possa avere intenzione di chiamare addObserver(_:selector:name:object:), dove il secondo messaggio parametro (selector:) viene inviato al primo parametro (la destinazione).

Invece, si sta chiamando il metodo sbagliato, addObserver(forName:object:queue:using:), che funziona in modo abbastanza diverso.

Inoltre, per quanto riguarda la seconda parte della tua domanda:

let DidTouchParticleView = NSNotification.Name("didTouchParticleView") 

Questo è corretto (quasi); dovrebbe essere

let DidTouchParticleView = Notification.Name("didTouchParticleView") 

Tutti i nomi di notifica sono ora Notification.Name istanze. Il modo corretto per farlo è quello di dire:

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

si può quindi fare riferimento al nome del notifica .didTouchParticleView in tutto il codice.

1

Stai guardando tu stesso a pubblicare la notifica (object: self). Probabilmente vuoi dire qualcosa come object: particle o eventualmente object: nil nella chiamata addObserver (ma fai attenzione a verificare che sia la particella giusta nel gestore). Rileggi i documenti per questo metodo e nota attentamente a cosa serve il parametro object.

Si noti che questa versione di addObserver restituisce un oggetto observer. È necessario memorizzarlo in modo da poter chiamare in seguito removeObserver con esso.

+0

Cambiare l'oggetto 'su zero lo risolve. Tuttavia, come fa a sapere che cosa è diventato l'osservatore? Prima, in Swift 2, c'era "addObserver:" che accetta un oggetto come osservatore. –

+1

@YoussefSami No, non hai capito cosa stava succedendo prima. L'oggetto non era l'osservatore. L'osservatore è _ricornato_ dalla chiamata. Non confondere questo con 'addObserver (_: selector: name: object:)', dove il primo parametro _è_ l'osservatore. Vedi ora la mia risposta modificata. – matt

+0

@matt Sì, è quello a cui mi riferivo. In che modo ora il Centro notifiche sa a quale oggetto inviare la notifica? –