Xcode4でMaster-Detail Application(Xcode3ではNavigation-Based Application)で新規作成したプロジェクトの場合、アプリケーションがバックグラウンドに移行した時にNavigationControllerが表示中のViewControllerのクラスによって処理を分けたい時がある。そんな時に処理を分ける方法。
- (void)applicationDidEnterBackground:(UIApplication *)application
{
id topViewCon = [(UINavigationController*)application.keyWindow.rootViewController topViewController];
NSLog(@"%@",NSStringFromClass([topViewCon class]));
if ([topViewCon isMemberOfClass:[MyViewControllerA class]]) {
// MyViewControllerAだった時にやりたい処理
} else if ([topViewCon isMemberOfClass:[MyViewControllerB class]]) {
// MyViewControllerBだった時にやりたい処理
}
}
isKindOfClassではなくisMemberOfClassとしたのは、継承したクラスは無視して厳密にクラスの種類で判断するため。
追記
上記のやり方だと#importしまくらないといけないので、場合によっては以下のように一度クラス名をNSStringで取得してから比較した方がいいかもしれない。
- (void)applicationDidEnterBackground:(UIApplication *)application
{
id topViewCon = [(UINavigationController*)application.keyWindow.rootViewController topViewController];
NSString *className = NSStringFromClass([topViewCon class]);
NSLog(@"%@",className);
if ([className isEqualToString:@"MyViewControllerA"]) {
// MyViewControllerAだった時にやりたい処理
} else if ([className isEqualToString:@"MyViewControllerB"]) {
// MyViewControllerBだった時にやりたい処理
}
}

NotificationCenter使って、viewWillAppear, viewDidDisappearのタイミングでaddObserver, removeObserveする方が実装楽だよ。
なるほど…たしかにそっちの方がコードが綺麗だし分かりやすいですね。
後で訂正記事を書きます。ありがとうございます。