1

アプリで一番上に表示されているビュー コントローラーへの参照を取得するにはどうすればよいですか。私は、navigationcontroller.[top|visible]viewcontroller を利用するソリューションを見ました。しかし、アプリではナビゲーション コントローラーを使用しません。

これはかなり一般的な使用例のように思えますが、top|visible View Controller にアクセスするのが難しいのは奇妙だと思います

4

4 に答える 4

3

これは、モーダル ビューとナビゲーション コントローラー (存在する場合) にも従う必要があります。

- (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;
    }
}
于 2013-09-03T13:02:45.753 に答える
1

ここではおそらくデリゲートパターンを使用する必要があります(子ビューコントローラに、呼び出すことができるオブジェクトへの参照を与えます)。投稿を編集して、トップビューコントローラへの参照が必要だと思う理由を説明する場合は、状況でデリゲートパターンを使用する方法についてアドバイスを提供できます。

しかし今のところ、私はあなたが自分で吊るすのに必要なロープをあなたに与えるだけです:

UIViewController *topVC = [UIApplication sharedApplication].keyWindow.rootViewController;
于 2012-11-14T08:21:44.947 に答える
0
-(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;
}
于 2017-02-25T09:23:37.333 に答える