Расширяя ответ @ Эрика, вы должны быть осторожны, так как keyWindow - это действительно то окно, которое вы хотите.Если вы пытаетесь использовать этот метод после касания чего-либо, например, в представлении оповещений, то keyWindow фактически будет окном оповещения, и это, несомненно, вызовет проблемы.Это происходило со мной в дикой природе при обработке глубоких ссылок через оповещение и вызывало SIGABRT без ОТКЛЮЧЕНИЯ СТЕКА.Всего сука для отладки.
Вот код, который я сейчас использую:
- (UIViewController *)getTopMostViewController {
UIWindow *topWindow = [UIApplication sharedApplication].keyWindow;
if (topWindow.windowLevel != UIWindowLevelNormal) {
NSArray *windows = [UIApplication sharedApplication].windows;
for(topWindow in windows)
{
if (topWindow.windowLevel == UIWindowLevelNormal)
break;
}
}
UIViewController *topViewController = topWindow.rootViewController;
while (topViewController.presentedViewController) {
topViewController = topViewController.presentedViewController;
}
return topViewController;
}
Не стесняйтесь смешивать это с любым вкусом получения контроллера вида, который вам нравится из других ответов наэтот вопрос.