sos の 作業メモ

プログラミングや英会話学習、マイルや旅行、日常生活など。最近はWebFormなASP.NETのお守りがお仕事です。

日々の生活にhappyをプラスする|ハピタス Gポイント

ApplicationのActive/InactiveをViewControllerでも捕まえたい

前のエントリーでも書いたけど、ViewController自体には、ApplicationのActive/Inactiveのイベントをキャッチする仕組みは存在しない。

でも、Active/Inactiveを捕まえて何らかの処理をしないといけないことが多い訳で、なければ作らないとけいない。

さっとググったらNotificationでの実装の記事が見つかったけど、使い慣れていないので他の方法を検討。 UIApplicationDelegateの

- (void)applicationDidBecomeActive:(UIApplication *)application;
- (void)applicationWillResignActive:(UIApplication *)application;

をさらにDelegateするようにすればいいんじゃない?ということで、色々工作

ApplicationStateDelegate.h

専用のプロトコルを定義。メソッドはUIApplicationDelegateからコピペ。

@protocol ApplicationStateDelegate

@required
- (void)applicationDidBecomeActive:(UIApplication *)application;
- (void)applicationWillResignActive:(UIApplication *)application;

@optional
@end

AppDelegate

ApplicationStateDelegateを実装したオブジェクトを保持するクラスとして、

NSMutableArray* _stateDelegates; 

をAppDelegateに追加。

そしてオブジェクトを登録/解除するためのメソッドを追加

- (void)registStateDelegate:(id<ApplicationStateDelegate>)statedelegate
{
    if(statedelegate){
        [_stateDelegates addObject:statedelegate];
    }
}

- (void)unregistStateDelegate:(id<ApplicationStateDelegate>)statedelegate
{
    if(statedelegate){
        [_stateDelegates removeObject:statedelegate];
    }
}

そしてイベントをさらに伝播させる処理を実装

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    for(id<ApplicationStateDelegate> obj in _stateDelegates){
        [obj applicationDidBecomeActive:application];
    }
}

- (void)applicationWillResignActive:(UIApplication *)application
{
    for(id<ApplicationStateDelegate> obj in _stateDelegates){
        [obj applicationWillResignActive:application];
    }
}

HogeViewController

イベントを受け取りたいクラスでApplicationStateDelegateを実装。

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    NSLog(@"%@",@"applicationDidBecomeActive");
}

- (void)applicationWillResignActive:(UIApplication *)application
{
    NSLog(@"%@",@"applicationWillResignActive");
}

最後に、AppDelegateに自分を登録。viewDidAppearとviewWillDisappearで登録/解除がよさげ。

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    AppDelegate* delegate = [UIApplication sharedApplication].delegate;
    [delegate registStateDelegate:self];
}

- (void)viewWillDisappear:(BOOL)animated
{
    AppDelegate* delegate = [UIApplication sharedApplication].delegate;
    [delegate unregistStateDelegate:self];
    [super viewWillDisappear:animated];
}

これでViewController内でもApplicationのActive/Inactiveを捕まえる事ができるようになりました。 めでたしめでたし。