iOS

[iOS SDK] アプリがアクティブになる度に呼ばれる applicationDidBecomeActive から View Controller に処理を渡す方法

View Controller 内に記述する viewDidload, viewWillAppear メソッドなどは、新しくアプリが起動した時、アプリ内の画面遷移後などに呼ばれます。

しかし、他のアプリから切り替わった時(アクティブになった時)には、View Controller 内のメソッドは、呼ばれることはないようです。

アクティブになった時には、UIApplicationDelegate プロトコルにある - (void) applicationDidBecomeActive:( UIApplication ) application メソッドが呼び出されますが、その処理は View Controller で行いたい。

そこで、アプリがアクティブになる度に呼ばれる applicationDidBecomeActive から View Controller に処理を渡す方法を調べましたので、紹介します。

追記 2013年5月6日 11:48

以下の様な処理を行わずとも、ViewController に次の NSNotification を登録しておけば、ApplicationDidBecomeActive のタイミングで通知が飛んできます。Yonemoto さん、ありがとうございました!

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(applicationDidBecomeActive)
                                             name:UIApplicationDidBecomeActiveNotification
                                           object:nil];

デフォルトの通知センタを作成して処理を渡す

NSNotificationCenter というクラスを使用すると、通知という仕組みを使用できます。

ここでは、applicationDidBecomeActive にデフォルトの通知センタを作成して、そこの通知を View Controller 内で受け取るように実装していきます。

AppDelegate.m に、デフォルト通知を用意します。

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"applicationDidBecomeActive" object:nil];
}

次に、ViewController.m に受け取る処理(オブザーバの登録)と受け取った後の処理を記述していきます。

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

- (void)applicationDidBecomeActive {
    NSLog(@"hogehoge");
}

dealloc メソッドで、applicationDidBecomeActive がオブザーバとなっている設定をデフォルトの通知センタから削除します。

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"applicationDidBecomeActive" object:nil];
    [super dealloc];   
}

これでアプリがアクティブになるたびに、「hogehoge」と表示されるはずです。

Special Thanks !