在iOS 9中,以下用于检测通知的代码不会触发选择器方法。在以前的版本(例如8.4)中它运行正常。有谁知道为什么?
[[NSNotificationCenter defaultCenter]addObserver:self
selector:@selector(yourMethod)
name:UIApplicationDidBecomeActiveNotification
object:nil];
- (void)yourMethod {NSLog(@"aaaaaaa");}
答案 0 :(得分:6)
以下链接可能有助于解决您的问题。
Foundation Release Notes for OS X v10.11
使用" addObserverForName "而不是" addObserver"。
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification
object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification * Nonnull note) {
[self yourMethod];
}];
这将是有效的。
答案 1 :(得分:3)
我讨厌同样的问题,对我而言,它将addObserver代码移动到awakeFromNib。另一种解决方案可能是向addObserver添加延迟,如下例所示:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil];
});
答案 2 :(得分:2)
在进行一些测试时,我注意到通知实际上是触发的,虽然不是在发布时(或者至少太早而无法被观察者捕获)(仅在模拟器上)。 / p>
尝试向上和向下拉动通知中心或上下控制中心,您将看到实际上会调用您的方法。
我建议您在应用启动时在iOS 9上手动调用您的方法吗?
在真实设备上,该方法就像在iOS 8上一样调用。
修改:经过进一步调查后,似乎每次都会在设备上触发通知:/
答案 3 :(得分:0)
我也遇到了这个问题,并且延迟添加观察者并没有在我的情况下解决它。通过直接在AppDelegate中调用方法并从主队列中调用来摆脱它,没有延迟。
夫特:
func applicationDidBecomeActive(application: UIApplication) {
dispatch_async(dispatch_get_main_queue()) { () -> Void in
yourMethod()
}
}
答案 4 :(得分:0)
我只在运行iOS 9.0及更高版本的真实设备上遇到完全相同的问题。
我最终定义了自己的通知:
(此定义应全局可用,constants.h
或类似)
#define myAppBecameActiveNotif @"Tito, your app is active"
然后,在AppDelegate实现(大多数情况下是AppDelegate.m)中,实现applicationDidBecomeActive
委托方法:
- (void)applicationDidBecomeActive:(UIApplication *)application {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:myAppBecameActiveNotif
object:nil];
});
}
(只需稍稍延迟发送通知,让您的组件生效)
现在,在课堂上,您希望通知应用程序变为活动状态
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(whatToDoWhenAppActive:)
name:myAppBecameActiveNotif
object:nil];
现在工作得很好。你会发现你感觉不到500毫秒的延迟...
答案 5 :(得分:-1)
我做那样的通知注册。
[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(yourMethod:) name:UIApplicationDidBecomeActiveNotification object:nil];
像这样编写方法。
- (void)yourMethod:(NSNotification *)notification
{
NSLog(@"aaaaaaa");
}
您还需要在AppDelegate.m中使用NSLog并查看登录控制台。
-(void)applicationDidBecomeActive:(UIApplication *)application{
NSLog(@"applicationDidBecomeActive");
}