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を捕まえる事ができるようになりました。 めでたしめでたし。