どのviewControllerがiPhoneアプリケーションで実行されているかをAppdelegateでプログラム的に確認する可能性はありますか
4 に答える
これに対する簡単な答えはありません。メイン ウィンドウのルート ビュー コントローラーから始めて、ビュー コントローラーの階層をたどる必要があります。に遭遇した場合は、UINavigationController
を見る必要がありますtopViewController
。に到達したらUIViewController
、 がある場合はそれを確認する必要がありますmodalViewController
。タブ バー コントローラがある場合は、現在選択されているタブを確認する必要があります。
これは一度に2つのView ControllerUISplitViewController
を表示できるため、複雑になります。
これが、 に追加できるカテゴリ メソッドの始まりですUIViewController
。これは、通常のビュー コントローラーとナビゲーション コントローラーのみを処理します。
- (UIViewController *)topMostController {
if (self.modalViewController) {
return [self.modalViewController topMostController];
} else {
if ([self isKindOfClass:[UINavigationController class]]) {
UINavigationController *nc = (UINavigationController *)self;
return [nc.topViewController topMostController];
} else {
return self;
}
}
}
キー ウィンドウの でアプリ デリゲートからこれを呼び出しますrootViewController
。
で rootViewController プロパティを設定したと仮定しますAppDelegate
。
[UIApplication sharedApplication].keyWindow.rootViewController;
ビュー コントローラの場合、現在実行中のビュー コントローラ名を取得することはできません。
そのためには、アプリのデリゲート ファイルに次のメソッドを 1 つ記述し、各 viewcontroller ビューで getCurentViewController メソッドを呼び出します。
-(void) getCurentViewController:(UIViewController*) vc
{
if([vc isMemberOfClass:NSClassFromString(@"vcName")])
{
//write your code here
}
else if([vc isMemberOfClass:NSClassFromString(@"vcName1")])
{
//write your code here
}
}
UIViewController *currentViewController = yourRootViewController;
while (currentViewController.presentedViewController) {
currentViewController = currentViewController.presentedViewController;
}
//currentViewController is now your top-most viewController
//I use this same snippet in my production code