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する方が実装楽だよ。
なるほど…たしかにそっちの方がコードが綺麗だし分かりやすいですね。
後で訂正記事を書きます。ありがとうございます。