在 Darwin 通知中心回调上调用 UIAlert
Posted
技术标签:
【中文标题】在 Darwin 通知中心回调上调用 UIAlert【英文标题】:Call UIAlert on Darwin notification center callback 【发布时间】:2016-05-17 16:45:14 【问题描述】:我在 ViewDidLoad 上创建了一个 Darwin 通知,我想在调用回调时调用 UIAlert。在这种情况下,我想在屏幕解锁时调用警报,为此我将创建一个变量,在第二次调用此回调时设置为 TRUE/YES(考虑到第一次将是用户锁定屏幕时和用户第二次解锁屏幕时)。当此变量为 TRUE/YES 时,将调用警报。
我该怎么做?
我的代码:
- (void)viewDidLoad
[super viewDidLoad];
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),
NULL,
hasBlankedScreen,
CFSTR("com.apple.springboard.hasBlankedScreen"),
NULL,
CFNotificationSuspensionBehaviorDeliverImmediately);
static void hasBlankedScreen(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo)
/*
if(isUnlocked)
[self myAlert];
else
isUnlocked = true;
*/
- (void) myAlert
UIAlertController * alert= [UIAlertController
alertControllerWithTitle:@"HEY"
message:@"Screen is unlocked"
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action)
[self pop];
];
[alert addAction:defaultAction];
[self presentViewController:alert animated:YES completion:nil];
【问题讨论】:
【参考方案1】:这很简单:
1) 将(const void*)self
作为观察者传递给CFNotificationCenterAddObserver
而不是NULL
;
2) 在hasBlankedScreen
中使用(__bridge ViewController*)observer
而不是self
。
完整代码:
- (void)viewDidLoad
[super viewDidLoad];
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),
(const void*)self,
hasBlankedScreen,
CFSTR("com.apple.springboard.hasBlankedScreen"),
NULL,
CFNotificationSuspensionBehaviorDeliverImmediately);
static void hasBlankedScreen(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo)
if (self.locked)
[(__bridge ViewController*)observer myAlert];
self.locked = NO;
else
self.locked = YES;
【讨论】:
以上是关于在 Darwin 通知中心回调上调用 UIAlert的主要内容,如果未能解决你的问题,请参考以下文章