アプリで一番上に表示されているビュー コントローラーへの参照を取得するにはどうすればよいですか。私は、navigationcontroller.[top|visible]viewcontroller を利用するソリューションを見ました。しかし、アプリではナビゲーション コントローラーを使用しません。
これはかなり一般的な使用例のように思えますが、top|visible View Controller にアクセスするのが難しいのは奇妙だと思います
アプリで一番上に表示されているビュー コントローラーへの参照を取得するにはどうすればよいですか。私は、navigationcontroller.[top|visible]viewcontroller を利用するソリューションを見ました。しかし、アプリではナビゲーション コントローラーを使用しません。
これはかなり一般的な使用例のように思えますが、top|visible View Controller にアクセスするのが難しいのは奇妙だと思います
これは、モーダル ビューとナビゲーション コントローラー (存在する場合) にも従う必要があります。
- (UIViewController *)deepestPresentedViewControllerOf:(UIViewController *)viewController
{
if (viewController.presentedViewController) {
return [self deepestPresentedViewControllerOf:viewController.presentedViewController];
} else {
return viewController;
}
}
- (UIViewController *)topViewController
{
UIViewController *rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController];
UIViewController *deepestPresentedViewController = [self deepestPresentedViewControllerOf:rootViewController];
if ([deepestPresentedViewController isKindOfClass:[UINavigationController class]]) {
return ((UINavigationController *)deepestPresentedViewController).topViewController;
} else {
return deepestPresentedViewController;
}
}
ここではおそらくデリゲートパターンを使用する必要があります(子ビューコントローラに、呼び出すことができるオブジェクトへの参照を与えます)。投稿を編集して、トップビューコントローラへの参照が必要だと思う理由を説明する場合は、状況でデリゲートパターンを使用する方法についてアドバイスを提供できます。
しかし今のところ、私はあなたが自分で吊るすのに必要なロープをあなたに与えるだけです:
UIViewController *topVC = [UIApplication sharedApplication].keyWindow.rootViewController;
-(UIViewController *)getCurrentViewController
{
UIViewController *result = nil;
UIWindow * window = [[UIApplication sharedApplication] keyWindow];
if (window.windowLevel != UIWindowLevelNormal)
{
NSArray *windows = [[UIApplication sharedApplication] windows];
for(UIWindow * tmpWin in windows)
{
if (tmpWin.windowLevel == UIWindowLevelNormal)
{
window = tmpWin;
break;
}
}
}
UIView *frontView = [[window subviews] objectAtIndex:0];
id nextResponder = [frontView nextResponder];
if ([nextResponder isKindOfClass:[UIViewController class]])
result = nextResponder;
else
result = window.rootViewController;
return result;
}