小编Jol*_*ino的帖子

application:didFinishLaunchingWithOptions:在创建目标控制器之前触发通知

您好,我正在编写一个应用程序,当使用本地通知打开它时,该应用程序应响应UI更新和内部状态更改.我正在使用故事板,我已经设置了我的主视图控制器来观察状态变化:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // ...
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resumeByNotification:) name:@"Resume" object:nil];
}
Run Code Online (Sandbox Code Playgroud)

在我的app委托中,我有这个:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    if (application.applicationState == UIApplicationStateInactive)
    {
        [[NSNotificationCenter defaultCenter] postNotificationName:@"Resume" object:self userInfo:notification.userInfo];
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好用:如果应用程序在后台运行,视图控制器将拦截通知并做出相应的反应.(如果应用程序在前台运行,则会被忽略,因为UI正在直接处理.)

当应用程序被杀死并收到通知时会出现问题.我已经在didFinishLaunchingWithOptions方法中编写了这个,让手机振动成为一种快速的调试技术:),我确实得到了通知:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UILocalNotification *localNotification = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
    if (localNotification)
    {
        [[NSNotificationCenter defaultCenter] postNotificationName:@"Resume" object:self userInfo:localNotification.userInfo];
        AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
    }

    return YES;
}
Run Code Online (Sandbox Code Playgroud)

电话会振动,因此通知就在那里,但它似乎没有触发观察者.我想这是因为尚未调用视图控制器的didViewLoad方法.我不知道如何解决这个问题.我想我可以使用UIStoryboard的instantiateViewControllerWithIdentifier:方法来确保视图控制器实际存在,但除了最终将由故事板自己的生命周期实例化之外,我不会得到它的"额外"实例. ?从课堂参考文献中的内容来看,这并不意味着要做这种事情.

我错过了一些非常明显的东西吗?事实上,对于这种情况,我的方法是正确的吗?

谢谢!

nsnotifications ios uistoryboard

11
推荐指数
1
解决办法
6215
查看次数

标签 统计

ios ×1

nsnotifications ×1

uistoryboard ×1