如何从UILocalNotification注册NSNotification?

时间:2010-12-29 14:21:48

标签: iphone ios nsnotification uilocalnotification

我有一个tabbar应用程序,让我们说我想切换到第二个标签,并在12:00时弹出警报,即使我的应用程序没有运行。

我得到了UILocalNotification的所有代码正常工作,但后来我认为最好的方法是通过发布应用代表的通知:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Add the tab bar controller's view to the window and display.
    [window addSubview:tabBarController.view];
    [window makeKeyAndVisible];

    // Handle launching from a notification when the app is NOT running
    UILocalNotification *localNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    if (localNotification) {
        [tabBarController setSelectedIndex:1];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"AlertNotification" object:self];
    }
    return YES;
}

然后,在我的SecondViewController.m中,我有:

- (void)viewDidLoad {
  [super viewDidLoad];
  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(popUpAlert:) name:@"AlertNotification" object:nil];
}

但这不起作用。我怀疑在没有调用SecondViewController的viewDidLoad时发送通知,对吧?有可能解决这个问题吗?你是否同意我在这种情况下使用NSNotificationCenter的方法?

提前致谢。

3 个答案:

答案 0 :(得分:3)

我快速创建了一个测试项目并通过将通知注册放在awakeFromNib(假设在xib文件中创建SecondViewController)来使其工作。

- (void)awakeFromNib {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(popUpAlert:) name:@"AlertNotification" object:nil];
}

答案 1 :(得分:0)

我猜,你是对的。它不起作用,因为您在将视图控制器添加为观察者之前发布通知。

另一种方法是向应用代理添加bool属性,以指示应用是否已从本地通知启动。 可以使用[[UIApplication sharedApplication] delegate]从应用中的任意位置请求应用代理。

答案 2 :(得分:0)

UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes: UIUserNotificationTypeAlert | UIUserNotificationTypeBadge categories:nil];
[[UIApplication shareApplication] registerUserNotificationSettings: settings];