iOSアプリのバックグラウンド移行時にクラスごとに処理を分ける

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だった時にやりたい処理
	}
}

「iOSアプリのバックグラウンド移行時にクラスごとに処理を分ける」への2件のフィードバック

  1. NotificationCenter使って、viewWillAppear, viewDidDisappearのタイミングでaddObserver, removeObserveする方が実装楽だよ。

  2. なるほど…たしかにそっちの方がコードが綺麗だし分かりやすいですね。
    後で訂正記事を書きます。ありがとうございます。

コメントを残す