Поиск rootViewController в iOS
В 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];
Кажется, это работает нормально. Неудачно ли это при некоторых условиях?
Ответы
Ответ 1
Я не уверен, что вы можете положиться на window.rootViewController
b/c, который вам не нужно устанавливать. Вы можете просто добавить subview в окно. Казалось, что все работает нормально:
id rootVC = [[[[[UIApplication sharedApplication] keyWindow] subviews] objectAtIndex:0] nextResponder];
Ответ 2
Быстрый способ сделать это, вы можете называть это где угодно:
/// 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
Ответ 3
Это сработало для меня:
UIViewController * rootViewController = (UIViewController *)[[[UIApplication.sharedApplication.keyWindow subviews] firstObject];