¿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
@objc
fin de usarlo como selector.Consulte la referencia de clase NSNotificationCenter , interactuando con las API de Objective-C
fuente
UIDeviceBatteryLevelDidChangeNotification
no 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
.methodOFReceivedNotication
debe estar anotadodynamic
o 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@objc
atributo 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
#selector
expresiones 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:)
.UIViewController
referenciaself
en 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.Name
lugar 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.Name
con 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
Selector
o usando
block
Publique su notificación
Para una
block
implementación basada, necesitas hacer un baile débil-fuerte si quieres usarself
dentro 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
@objc
si su clase de observador hereda deNSObject
.String
aSelector
tampoco. :)@objc
anotación del método en miNSObject
clase de no observador, agregué laas Selector
transmisión alString
nombre 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.@objc
anotación funcione para ti, y de esta manera no, ¡entonces sigue anotando!En swift 2.2 - XCode 7.3, utilizamos
#selector
paraNSNotificationCenter
fuente
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
#selector
debe 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