如何在默认的通知中心中添加一个观察者?我试图移植这行代码,当电池电量变化时发送通知。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(batteryLevelChanged:) name:UIDeviceBatteryLevelDidChangeNotification object:nil];
如何在默认的通知中心中添加一个观察者?我试图移植这行代码,当电池电量变化时发送通知。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(batteryLevelChanged:) name:UIDeviceBatteryLevelDidChangeNotification object:nil];
当前回答
这是一个非常简单的自定义通知观察者和post的例子
添加通知观察员
NotificationCenter.default.addObserver(self, selector: #selector(myFunction), name: Notification.Name("CustomeNotificationName"), object: nil)
添加选择器并处理观察者调用
@objc func myFunction(notification: Notification) {
//Write you code
}
在需要时发布通知(观察员)。
NotificationCenter.default.post(name: NSNotification.Name("CustomeNotificationName"), object: "Object", userInfo: ["key":"Value"])
注意:-当你离开屏幕时,你需要删除观察者。如。
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
NotificationCenter.default.removeObserver(self);
}
其他回答
使用NSNotificationCenter传递数据
也支持通过swift 3.0中的NotificationCentre和swift 2.0中的NSNotificationCenter进行数据传递。
Swift 2.0版本
使用userInfo传递信息,userInfo是一个可选的字典类型[NSObject: AnyObject]?
let imageDataDict:[String: UIImage] = ["image": image]
// Post a notification
NSNotificationCenter.defaultCenter().postNotificationName(notificationName, object: nil, userInfo: imageDataDict)
// Register to receive notification in your class
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.showSpinningWheel(_:)), name: notificationName, object: nil)
// handle notification
func showSpinningWheel(notification: NSNotification) {
if let image = notification.userInfo?["image"] as? UIImage {
// do something with your image
}
}
Swift 3.0版本
userInfo现在需要[AnyHashable:Any]?作为一个参数,我们在Swift中作为字典字面量提供
let imageDataDict:[String: UIImage] = ["image": image]
// post a notification
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "notificationName"), object: nil, userInfo: imageDataDict)
// `default` is now a property, not a method call
// Register to receive notification in your class
NotificationCenter.default.addObserver(self, selector: #selector(self.showSpinningWheel(_:)), name: NSNotification.Name(rawValue: "notificationName"), object: nil)
// handle notification
func showSpinningWheel(_ notification: NSNotification) {
if let image = notification.userInfo?["image"] as? UIImage {
// do something with your image
}
}
使用NotificationCentre(swift 3.0)和NSNotificationCenter(swift 2.0)传递源数据
Xcode 8中的Swift 3.0
Swift 3.0已经用结构“包装器类型”取代了许多“字符串类型”的api, NotificationCenter也是如此。通知现在由struct notification标识。名称而不是字符串。参见迁移到Swift 3指南。
以前的用法:
// Define identifier
let notificationIdentifier: String = "NotificationIdentifier"
// Register to receive notification
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(YourClassName.methodOfReceivedNotification(_:)), name: notificationIdentifier, object: nil)
// Post a notification
NSNotificationCenter.defaultCenter().postNotificationName(notificationIdentifier, object: nil)
Swift 3.0的新用法:
// Define identifier
let notificationName = Notification.Name("NotificationIdentifier")
// Register to receive notification
NotificationCenter.default.addObserver(self, selector: #selector(YourClassName.methodOfReceivedNotification), name: notificationName, object: nil)
// Post notification
NotificationCenter.default.post(name: notificationName, object: nil)
所有系统通知类型现在都定义为notification . name上的静态常量;例如。uidevicebatteryleveldidchange, . uiapplicationdidfinishlaunching, . uitextfieldtextdidchange等。
您可以扩展通知。使用您自己的自定义通知命名,以便与系统通知保持一致:
// Definition:
extension Notification.Name {
static let yourCustomNotificationName = Notification.Name("yourCustomNotificationName")
}
// Usage:
NotificationCenter.default.post(name: .yourCustomNotificationName, object: nil)
在swift 3, Xcode 8.2:-检查电池状态水平
//Add observer
NotificationCenter.default.addObserver(self, selector: #selector(batteryStateDidChange), name: NSNotification.Name.UIDeviceBatteryStateDidChange, object: nil)
//Fired when battery level changes
func batteryStateDidChange(notification: NSNotification){
//perform manipulation here
}
这是一个非常简单的自定义通知观察者和post的例子
添加通知观察员
NotificationCenter.default.addObserver(self, selector: #selector(myFunction), name: Notification.Name("CustomeNotificationName"), object: nil)
添加选择器并处理观察者调用
@objc func myFunction(notification: Notification) {
//Write you code
}
在需要时发布通知(观察员)。
NotificationCenter.default.post(name: NSNotification.Name("CustomeNotificationName"), object: "Object", userInfo: ["key":"Value"])
注意:-当你离开屏幕时,你需要删除观察者。如。
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
NotificationCenter.default.removeObserver(self);
}
它与Objective-C API相同,但使用了Swift的语法。
Swift 4.2和Swift 5:
NotificationCenter.default.addObserver(
self,
selector: #selector(self.batteryLevelChanged),
name: UIDevice.batteryLevelDidChangeNotification,
object: nil)
如果你的观察者没有从Objective-C对象继承,你必须用@objc作为你的方法的前缀来使用它作为选择器。
@objc private func batteryLevelChanged(notification: NSNotification){
//do stuff using the userInfo property of the notification object
}
参见NSNotificationCenter类参考,与Objective-C api交互