Answers:
应用程序中的任何类都可以成为应用程序中不同通知的“观察者”。创建(或加载)视图控制器时,您需要将其注册为的观察者,UIApplicationDidBecomeActiveNotification
并指定当该通知发送到应用程序时要调用的方法。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(someMethod:)
name:UIApplicationDidBecomeActiveNotification object:nil];
不要忘了自己清理!当视图消失时,请记住将自己作为观察者:
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIApplicationDidBecomeActiveNotification
object:nil];
有关通知中心的更多信息。
斯威夫特3,4等效:
添加观察者
NotificationCenter.default.addObserver(self,
selector: #selector(applicationDidBecomeActive),
name: .UIApplicationDidBecomeActive, // UIApplication.didBecomeActiveNotification for swift 4.2+
object: nil)
删除观察者
NotificationCenter.default.removeObserver(self,
name: .UIApplicationDidBecomeActive, // UIApplication.didBecomeActiveNotification for swift 4.2+
object: nil)
打回来
@objc func applicationDidBecomeActive() {
// handle event
}
viewDidLoad
或viewWillAppear:animated
为实例。而且,当您不再需要通知时,或者将要在deinit方法中释放观察者实例时,可以删除观察者
Swift 2等效:
let notificationCenter = NSNotificationCenter.defaultCenter()
// Add observer:
notificationCenter.addObserver(self,
selector:Selector("applicationWillResignActiveNotification"),
name:UIApplicationWillResignActiveNotification,
object:nil)
// Remove observer:
notificationCenter.removeObserver(self,
name:UIApplicationWillResignActiveNotification,
object:nil)
// Remove all observer for all notifications:
notificationCenter.removeObserver(self)
// Callback:
func applicationWillResignActiveNotification() {
// Handle application will resign notification event.
}
removeObserver
Swift的最佳位置:deinit
方法。
斯威夫特4.2
添加观察者-
NotificationCenter.default.addObserver(self, selector: #selector(handleEvent), name: UIApplication.didBecomeActiveNotification, object: nil)
删除观察者-
NotificationCenter.default.removeObserver(self, name: UIApplication.didBecomeActiveNotification, object: nil)
处理事件
@objc func handleEvent() {
}
对于Swift 4,Apple通过新的编译器警告建议我们避免#selector
在这种情况下使用。以下是完成此操作的更安全的方法:
首先,创建一个可以由通知使用的惰性变量:
lazy var didBecomeActive: (Notification) -> Void = { [weak self] _ in
// Do stuff
}
如果您需要实际通知被收录,只需更换_
用notification
。
接下来,我们设置通知以观察该应用程序是否处于活动状态。
func setupObserver() {
_ = NotificationCenter.default.addObserver(forName: .UIApplicationDidBecomeActive,
object: nil,
queue:.main,
using: didBecomeActive)
}
这里最大的变化是#selector
,我们现在不再调用a ,而是调用上面创建的var。这可以消除出现无效选择器崩溃的情况。
最后,我们删除观察者。
func removeObserver() {
NotificationCenter.default.removeObserver(self, name: .UIApplicationDidBecomeActive, object: nil)
}
#selector
可以调用@objc
在Swift 4中声明为属性的方法
removeObserver(self
因为添加观察者时未分配self。let observer = NotificationCenter.default.addObserver
然后,您应该removeObserver(observer
@objc
。但是,当我尝试它时,我在控制台中收到警告(Xcode 11.3.1(11C504),Swift 13.3):无法结束BackgroundTask:不存在带有标识符的后台任务。即使将观察者保存为NSObjectProtocol变量。
@objc
变体,我也会收到警告。
斯威夫特5
fileprivate func addObservers() {
NotificationCenter.default.addObserver(self,
selector: #selector(applicationDidBecomeActive),
name: UIApplication.didBecomeActiveNotification,
object: nil)
}
fileprivate func removeObservers() {
NotificationCenter.default.removeObserver(self, name: UIApplication.didBecomeActiveNotification, object: nil)
}
@objc fileprivate func applicationDidBecomeActive() {
// here do your work
}
NSNotificationCenter
。谢谢!