如何将Swift中的观察者添加到默认通知中心?我正在尝试移植这行代码,当电池电量变化时,它会发送通知。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(batteryLevelChanged:) name:UIDeviceBatteryLevelDidChangeNotification object:nil];
发布于 2016-01-27 21:30:19
这样做的一个好方法是使用addObserver(forName:object:queue:using:)
方法,而不是Objective-C代码中经常使用的addObserver(_:selector:name:object:)
方法。第一个变体的优点是,您不必在方法上使用@objc
属性:
func batteryLevelChanged(notification: Notification) {
// do something useful with this information
}
let observer = NotificationCenter.default.addObserver(
forName: NSNotification.Name.UIDeviceBatteryLevelDidChange,
object: nil, queue: nil,
using: batteryLevelChanged)
如果您愿意,您甚至可以使用闭包而不是方法:
let observer = NotificationCenter.default.addObserver(
forName: NSNotification.Name.UIDeviceBatteryLevelDidChange,
object: nil, queue: nil) { _ in print("") }
您可以稍后使用返回值停止监听通知:
NotificationCenter.default.removeObserver(observer)
使用这种方法还有另一个好处,那就是它不需要你使用选择器字符串,因为选择器字符串不能被编译器静态检查,所以如果方法被重命名,那么很容易被破坏,但是Swift 2.2和更高版本包含了解决这个问题的#selector
expressions。
发布于 2016-03-30 16:57:36
在swift 2.2 - XCode 7.3中,我们对NSNotificationCenter
使用#selector
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(rotate), name: UIDeviceOrientationDidChangeNotification, object: nil)
发布于 2017-03-09 11:22:55
我们也应该删除通知。
例如。
deinit
{
NotificationCenter.default.removeObserver(self, name:NSNotification.Name(rawValue: "notify"), object: nil)
}
https://stackoverflow.com/questions/24049020
复制相似问题