¿Cómo agrega un observador en Swift al centro de notificaciones predeterminado? Estoy intentando portar esta línea de código que envía una notificación cuando cambia el nivel de la batería.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(batteryLevelChanged:) name:UIDeviceBatteryLevelDidChangeNotification object:nil];
                
                    
                        ios
                                swift
                                nsnotificationcenter
                                
                    
                    
                        Mora azul
fuente
                
                fuente

Respuestas:
Es lo mismo que la API Objective-C, pero usa la sintaxis de Swift.
Swift 4.2 y Swift 5:
Si su observador no hereda de un objeto Objective-C, debe anteponer su método con el
@objcfin de usarlo como selector.Consulte la referencia de clase NSNotificationCenter , interactuando con las API de Objective-C
fuente
UIDeviceBatteryLevelDidChangeNotificationno está entre comillas? Es un tipo de cadena.@objc.Swift 4.0 y Xcode 9.0+:
Enviar (publicar) notificación:
O
Recibir (Obtener) Notificación:
Manejador de métodos y funciones para notificaciones recibidas:
Swift 3.0 y Xcode 8.0+:
Enviar (publicar) notificación:
Recibir (Obtener) Notificación:
Manejador de métodos para notificaciones recibidas:
Eliminar notificación:
Swift 2.3 y Xcode 7:
Enviar (publicar) notificación
Recibir (Obtener) Notificación
Manejador de métodos para notificaciones recibidas
Para versiones históricas de Xcode ...
Enviar (publicar) notificación
Recibir (Obtener) Notificación
Eliminar notificación
Manejador de métodos para notificaciones recibidas
Anote la clase o el método de destino con @objc
fuente
@objc.methodOFReceivedNoticationdebe estar anotadodynamico ser miembro de una subclase de NSObject.object 0x7fd68852d710 of class 'TestNotifications.MyObject' does not implement methodSignatureForSelector: -- trouble ahead,Unrecognized selector -[TestNotifications.MyObject methodOFReceivedNotication:]Una buena manera de hacerlo es usar el
addObserver(forName:object:queue:using:)método en lugar deladdObserver(_:selector:name:object:)método que se usa a menudo del código Objective-C. La ventaja de la primera variante es que no tiene que usar el@objcatributo en su método:e incluso puedes usar un cierre en lugar de un método si quieres:
Puede usar el valor devuelto para dejar de escuchar la notificación más adelante:
Solía haber otra ventaja en el uso de este método, que era que no requería el uso de cadenas de selector que el compilador no podía verificar estáticamente y, por lo tanto, eran frágiles si se cambiaba el nombre del método, pero Swift 2.2 y más tarde incluye
#selectorexpresiones que arreglan ese problema.fuente
addObserver(_:selector:name:object:)forma de cancelar el registro. Tienes que mantener el objeto devueltoaddObserverForName(_:object:queue:usingBlock:)y pasarlo aremoveObserver:addObserverForName(_:object:queue:usingBlock:).UIViewControllerreferenciaselfen ese cierre, debe usarlo[weak self]o tendrá un ciclo de referencia y la pérdida de memoria.Swift 3.0 en Xcode 8
Swift 3.0 ha reemplazado muchas API "de tipo secuencial" con
struct"tipos de contenedor", como es el caso de NotificationCenter. Las notificaciones ahora se identifican por un enstruct Notfication.Namelugar de porString. Consulte la guía Migración a Swift 3 .Uso previo :
Nuevo uso de Swift 3.0:
Todos los tipos de notificación del sistema ahora se definen como constantes estáticas en
Notification.Name; es decir.UIDeviceBatteryLevelDidChange,.UIApplicationDidFinishLaunching,.UITextFieldTextDidChange, etc.Puede ampliar
Notification.Namecon sus propias notificaciones personalizadas para mantenerse coherente con las notificaciones del sistema:fuente
Declarar un nombre de notificación
Puede agregar observador de dos maneras:
Utilizando
Selectoro usando
blockPublique su notificación
Para una
blockimplementación basada, necesitas hacer un baile débil-fuerte si quieres usarselfdentro del bloque. más informaciónLos observadores basados en bloques deben eliminarse más información
fuente
Pase datos utilizando NSNotificationCenter
También puede pasar datos utilizando NotificationCentre en swift 3.0 y NSNotificationCenter en swift 2.0.
Versión Swift 2.0
¿Pasar información usando userInfo, que es un diccionario opcional de tipo [NSObject: AnyObject]?
Versión Swift 3.0
El userInfo ahora toma [AnyHashable: Any]? como argumento, que proporcionamos como un diccionario literal en Swift
Datos del pase de origen utilizando NotificationCentre (swift 3.0) y NSNotificationCenter (swift 2.0)
fuente
En Swift 5
ViewControllerA (receptor)
ViewControllerB (remitente)
fuente
Puedo hacer una de las siguientes acciones para usar con éxito un selector, sin anotar nada con @objc:
O
Mi versión xcrun muestra Swift 1.2, y esto funciona en Xcode 6.4 y Xcode 7 beta 2 (que pensé que usaría Swift 2.0):
fuente
@objcsi su clase de observador hereda deNSObject.StringaSelectortampoco. :)@objcanotación del método en miNSObjectclase de no observador, agregué laas Selectortransmisión alStringnombre del selector y, cuando se activa la notificación, la aplicación se bloquea. Mi versión Swift es exactamente la misma que la tuya.@objcanotación funcione para ti, y de esta manera no, ¡entonces sigue anotando!En swift 2.2 - XCode 7.3, utilizamos
#selectorparaNSNotificationCenterfuente
Deberíamos eliminar la notificación también.
Ex.
fuente
En swift 3, Xcode 8.2: - comprobación del nivel del estado de la batería
fuente
NSNotificationCenter agrega sintaxis de observador en Swift 4.0 para iOS 11
Esto es para el tipo de nombre de notificación keyboardWillShow. Se puede seleccionar otro tipo de la opción disponible
el selector es del tipo @objc func que maneja cómo se mostrará el teclado (esta es su función de usuario)
fuente
#selectordebe ser anotada@objc. Por ejemplo: ¡@objc func keyboardShow() { ... }Eso me arrojó por un minuto en Swift 4!Swift 5 y Xcode 10.2:
fuente
Observador de notificaciones de Swift 5
fuente