Поиск rootViewController в iOS - PullRequest
       15

Поиск rootViewController в iOS

10 голосов
/ 21 декабря 2011

В ShareKit код должен определить, где находится rootViewController, чтобы он мог отображать модальное представление.По какой-то причине в iOS 5 происходит сбой кода:

    // Try to find the root view controller programmically

    // Find the top window (that is not an alert view or other window)
    UIWindow *topWindow = [[UIApplication sharedApplication] keyWindow];
    if (topWindow.windowLevel != UIWindowLevelNormal)
    {
        NSArray *windows = [[UIApplication sharedApplication] windows];
        for(topWindow in windows)
        {
            if (topWindow.windowLevel == UIWindowLevelNormal)
                break;
        }
    }

    UIView *rootView = [[topWindow subviews] objectAtIndex:0];  
    id nextResponder = [rootView nextResponder];

    if ([nextResponder isKindOfClass:[UIViewController class]])
        self.rootViewController = nextResponder;

    else
        NSAssert(NO, @"ShareKit: Could not find a root view controller.  You can assign one manually by calling [[SHK currentHelper] setRootViewController:YOURROOTVIEWCONTROLLER].");

Это ударяет по утверждению.

Что не так с простым использованием следующего кода вместо этого?

rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController];

Кажется, это работает нормально.Это потерпит неудачу при некоторых условиях?

Ответы [ 3 ]

28 голосов
/ 21 декабря 2011

Я не уверен, что если вы можете положиться на window.rootViewController b / c, вам не нужно его устанавливать. Вы можете просто добавить подпредставление в окно. Казалось, что следующее работает нормально:

id rootVC = [[[[[UIApplication sharedApplication] keyWindow] subviews] objectAtIndex:0] nextResponder];
1 голос
/ 24 ноября 2015

Быстрый способ сделать это, вы можете вызвать это из любого места:

/// EZSwiftExtensions - Gives you the VC on top so you can easily push your popups
public var topMostVC: UIViewController? {
    var presentedVC = UIApplication.sharedApplication().keyWindow?.rootViewController
    while let pVC = presentedVC?.presentedViewController {
        presentedVC = pVC
    }

    if presentedVC == nil {
        print("EZSwiftExtensions Error: You don't have any views set. You may be calling them in viewDidLoad. Try viewDidAppear instead.")
    }
    return presentedVC
}

Он включен в качестве стандартной функции в:

https://github.com/goktugyil/EZSwiftExtensions

0 голосов
/ 07 мая 2019

Это сработало для меня:

UIViewController * rootViewController = (UIViewController *)[[[UIApplication.sharedApplication.keyWindow subviews] firstObject];
...