如何在默认的通知中心中添加一个观察者?我试图移植这行代码,当电池电量变化时发送通知。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(batteryLevelChanged:) name:UIDeviceBatteryLevelDidChangeNotification object:nil];
如何在默认的通知中心中添加一个观察者?我试图移植这行代码,当电池电量变化时发送通知。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(batteryLevelChanged:) name:UIDeviceBatteryLevelDidChangeNotification object:nil];
当前回答
Swift 5和Xcode 10.2:
NotificationCenter.default.addObserver(
self,
selector: #selector(batteryLevelDidChangeNotification),
name: UIDevice.batteryLevelDidChangeNotification,
object: nil)
其他回答
Declare a notification name extension Notification.Name { static let purchaseDidFinish = Notification.Name("purchaseDidFinish") } You can add observer in two ways: Using Selector NotificationCenter.default.addObserver(self, selector: #selector(myFunction), name: .purchaseDidFinish, object: nil) @objc func myFunction(notification: Notification) { print(notification.object ?? "") //myObject print(notification.userInfo ?? "") //[AnyHashable("key"): "Value"] } or using block NotificationCenter.default.addObserver(forName: .purchaseDidFinish, object: nil, queue: nil) { [weak self] (notification) in guard let strongSelf = self else { return } strongSelf.myFunction(notification: notification) } func myFunction(notification: Notification) { print(notification.object ?? "") //myObject print(notification.userInfo ?? "") //[AnyHashable("key"): "Value"] } Post your notification NotificationCenter.default.post(name: .purchaseDidFinish, object: "myObject", userInfo: ["key": "Value"])
iOS 9和OS X 10.11。它不再需要一个 NSNotificationCenter观察者取消注册 收回。更多信息
对于基于块的实现,如果你想在块中使用self,你需要做一个弱-强舞蹈。更多信息
基于块的观察者需要删除更多信息
let center = NSNotificationCenter.defaultCenter()
center.removeObserver(self.localeChangeObserver)
Swift 5和Xcode 10.2:
NotificationCenter.default.addObserver(
self,
selector: #selector(batteryLevelDidChangeNotification),
name: UIDevice.batteryLevelDidChangeNotification,
object: nil)
我能够做以下之一成功地使用选择器-没有注释任何@objc:
NSNotificationCenter.defaultCenter().addObserver(self,
selector:"batteryLevelChanged:" as Selector,
name:"UIDeviceBatteryLevelDidChangeNotification",
object:nil)
OR
let notificationSelector: Selector = "batteryLevelChanged:"
NSNotificationCenter.defaultCenter().addObserver(self,
selector: notificationSelector,
name:"UIDeviceBatteryLevelDidChangeNotification",
object:nil)
我的xcrun版本显示Swift 1.2,这适用于Xcode 6.4和Xcode 7 beta 2(我认为会使用Swift 2.0):
$xcrun swift --version
Apple Swift version 1.2 (swiftlang-602.0.53.1 clang-602.0.53)
使用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)传递源数据
创建一个objc函数,当通知被调用时执行该函数。
@objc func reloadNotification(_ notification: Notification) {
tblview.reloadData()
}
在didload视图中添加通知观察者。
NotificationCenter.default.addObserver(self, selector:#selector(reloadNotification(_:)), name: Notification.Name("reloadSideMenuDataNS"),object: nil)
将通知发布到想要调用函数的位置。
NotificationCenter.default.post(name: Notification.Name("reloadSideMenuDataNS"), object: nil)
您可以删除您的通知在视图已消失下面。
NotificationCenter.default.removeObserver(self, name: Notification.Name("reloadSideMenuDataNS"), object: nil)