Como você adiciona um observador no Swift ao centro de notificação padrão? Estou tentando portar essa linha de código que envia uma notificação quando o nível da bateria muda.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(batteryLevelChanged:) name:UIDeviceBatteryLevelDidChangeNotification object:nil];
ios
swift
nsnotificationcenter
Berry Blue
fonte
fonte
Respostas:
É o mesmo que a API do Objective-C, mas usa a sintaxe do Swift.
Swift 4.2 e Swift 5:
Se o seu observador não herdar de um objeto Objective-C, você deve prefixar seu método
@objc
para usá-lo como seletor.Consulte Referência da classe NSNotificationCenter , Interagindo com APIs do Objective-C
fonte
UIDeviceBatteryLevelDidChangeNotification
não está entre aspas? É um tipo de string.@objc
.Swift 4.0 e Xcode 9.0+:
Enviar (Post) Notificação:
OU
Receber (Obter) Notificação:
Manipulador de método de função para notificação recebida:
Swift 3.0 e Xcode 8.0 ou superior:
Enviar (Post) Notificação:
Receber (Obter) Notificação:
Manipulador de método para a notificação recebida:
Remover notificação:
Swift 2.3 e Xcode 7:
Enviar (Post) Notificação
Receber (receber) notificação
Manipulador de método para a notificação recebida
Para versões históricas do Xcode ...
Enviar (Post) Notificação
Receber (receber) notificação
Remover notificação
Manipulador de método para a notificação recebida
Anote a classe ou o método de destino com @objc
fonte
@objc
.methodOFReceivedNotication
deve ser anotadodynamic
ou ser membro de uma subclasse de NSObject.object 0x7fd68852d710 of class 'TestNotifications.MyObject' does not implement methodSignatureForSelector: -- trouble ahead
, #Unrecognized selector -[TestNotifications.MyObject methodOFReceivedNotication:]
Uma boa maneira de fazer isso é usar o
addObserver(forName:object:queue:using:)
método em vez doaddObserver(_:selector:name:object:)
método geralmente usado no código Objective-C. A vantagem da primeira variante é que você não precisa usar o@objc
atributo no seu método:e você pode até usar um fechamento em vez de um método, se quiser:
Você pode usar o valor retornado para parar de receber a notificação posteriormente:
Costumava haver outra vantagem no uso desse método, que não exigia o uso de seqüências seletoras que não pudessem ser verificadas estaticamente pelo compilador e, portanto, eram frágeis para serem quebradas se o método fosse renomeado, mas Swift 2.2 e depois, inclua
#selector
expressões que corrigem esse problema.fonte
addObserver(_:selector:name:object:)
maneira de cancelar o registro. Você tem que manter o objeto retornado poraddObserverForName(_:object:queue:usingBlock:)
e passá-lo pararemoveObserver:
addObserverForName(_:object:queue:usingBlock:)
.UIViewController
e se referir aself
esse fechamento, precisará usar[weak self]
ou terá um ciclo de referência e vazamento de memória.Swift 3.0 no Xcode 8
O Swift 3.0 substituiu muitas APIs
struct
"do tipo string" por "tipos de wrapper", como é o caso do NotificationCenter. As notificações agora são identificadas por umstruct Notfication.Name
e não porString
. Consulte o guia Migrando para o Swift 3 .Uso anterior :
Novo uso do Swift 3.0:
Todos os tipos de notificação do sistema agora são definidos como constantes estáticas ativadas
Notification.Name
; ou seja.UIDeviceBatteryLevelDidChange
,.UIApplicationDidFinishLaunching
,.UITextFieldTextDidChange
, etc.Você pode estender
Notification.Name
suas próprias notificações personalizadas para permanecer consistente com as notificações do sistema:fonte
Declarar um nome de notificação
Você pode adicionar observador de duas maneiras:
Usando
Selector
ou usando
block
Publique sua notificação
Para
block
implementação baseada, você precisa fazer uma dança fraco-forte se quiser usarself
dentro do bloco. mais informaçõesObservadores baseados em blocos precisam ser removidos mais informações
fonte
Passar dados usando o NSNotificationCenter
Você também pode transmitir dados usando o NotificationCentre no swift 3.0 e o NSNotificationCenter no swift 2.0.
Versão Swift 2.0
Passar informações usando userInfo, que é um dicionário opcional do tipo [NSObject: AnyObject]?
Versão Swift 3.0
O userInfo agora usa [AnyHashable: Any]? como argumento, que fornecemos como um literal de dicionário no Swift
Dados da passagem de origem usando o NotificationCentre (swift 3.0) e o NSNotificationCenter (swift 2.0)
fonte
No Swift 5
ViewControllerA (Receiver)
ViewControllerB (Remetente)
fonte
Posso fazer o seguinte para usar com sucesso um seletor - sem fazer anotações em nada com @objc:
OU
Minha versão do xcrun mostra o Swift 1.2, e isso funciona no Xcode 6.4 e no Xcode 7 beta 2 (que eu pensei que usaria o Swift 2.0):
fonte
@objc
se sua classe de observador herdarNSObject
.String
paraSelector
. :)@objc
anotação do método na minhaNSObject
classe de não observador, adicionei aas Selector
conversão aoString
nome do seletor e, quando a notificação é acionada, o aplicativo falha. Minha versão do Swift é exatamente igual à sua.@objc
anotação funcione para você, e dessa maneira não, continue anotando!No swift 2.2 - XCode 7.3, usamos
#selector
paraNSNotificationCenter
fonte
Também devemos remover a notificação.
Ex.
fonte
No swift 3, Xcode 8.2: - verificação do nível do estado da bateria
fonte
NSNotificationCenter adiciona sintaxe de observador no Swift 4.0 para iOS 11
É para o tipo de nome de notificação keyboardWillShow. Outro tipo pode ser selecionado na opção disponível
o seletor é do tipo @objc func, que lida com a aparência do teclado (essa é a sua função de usuário)
fonte
#selector
deve ser anotada@objc
. Por exemplo:@objc func keyboardShow() { ... }
Isso me impressionou por um minuto no Swift 4!Swift 5 e Xcode 10.2:
fonte
Observador de notificações Swift 5
fonte