I think you need a combination of the accepted answer and @fishstix's
+ (UIViewController*) topMostController { UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController; while (topController.presentedViewController) { topController = topController.presentedViewController; } return topController; } Swift 3.0+
func topMostController() -> UIViewController? { guard let rootViewControllerwindow = UIApplication.shared.keyWindow?, let rootViewController = window.rootViewController else { return nil } var topController = rootViewController while let newTopController = topController.presentedViewController { topController = newTopController } return topController }