This is an improvement to Eric's answer:
UIViewController *_topMostController(UIViewController *cont) { UIViewController *topController = cont; while (topController.presentedViewController) { topController = topController.presentedViewController; } if ([topController isKindOfClass:[UINavigationController class]]) { UIViewController *visible = ((UINavigationController *)topController).visibleViewController; if (visible) { topController = visible; } } return (topController != cont ? topController : nil); } UIViewController *topMostController() { UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController; UIViewController *next = nil; while ((next = _topMostController(topController)) != nil) { topController = next; } return topController; } _topMostController(UIViewController *cont) is a helper function.
Now all you need to do is call topMostController() and the very top most UIViewController should be returned!