0

I am implementing this method but it always returns me rootviewcontroller, not current visible controller how can I find out a visible controller. I also follow this link. iPhone -- How to find topmost view controller. but the same problem yet.

    + (UIViewController *)visibleViewController:(UIViewController *)rootViewController
{
    if (rootViewController.presentedViewController == nil)
    {
        return rootViewController;
    }
    if ([rootViewController.presentedViewController isKindOfClass:[UINavigationController class]])
    {
        UINavigationController *navigationController = (UINavigationController *)rootViewController.presentedViewController;
        UIViewController *lastViewController = [[navigationController viewControllers] lastObject];

        return [self visibleViewController:lastViewController];
    }
    if ([rootViewController.presentedViewController isKindOfClass:[UITabBarController class]])
    {
        UITabBarController *tabBarController = (UITabBarController *)rootViewController.presentedViewController;
        UIViewController *selectedViewController = tabBarController.selectedViewController;

        return [self visibleViewController:selectedViewController];
    }

    UIViewController *presentedViewController = (UIViewController *)rootViewController.presentedViewController;

    return [self visibleViewController:presentedViewController];
}
kalpesh satasiya
  • 799
  • 8
  • 18
Shahbaz Akram
  • 1,598
  • 3
  • 28
  • 45

4 Answers4

0

I think the issue is with your function.May be your root view controller is not correct. Try to implement the following function and see if it is working for you:

+ (UIViewController*) topMostController
{
    UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;

    while (topController.presentedViewController) {
        topController = topController.presentedViewController;
    }

    return topController;
}
User511
  • 1,456
  • 10
  • 28
0

Objecive C

+ (UIViewController*) topMostController { // top most ViewController
    UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;

    while (topController.presentedViewController) {
        topController = topController.presentedViewController;
    }

    return topController;
}

Swift3.0

extension UIApplication {
  func topMostViewController() -> UIViewController? { // top most ViewController
    return self.keyWindow?.rootViewController?.topMostViewController()
   }
}

// Find top most ViewController in Appdelegate
let topController = UIApplication.shared.topMostViewController()
Kathiresan Murugan
  • 2,783
  • 3
  • 23
  • 44
0

I think your logic isn't quite right. Try:

+(UIViewController*)topMostController
{
    return [[self class] visibleControllerForController:[UIApplication sharedApplication].keyWindow.rootViewController];
}

+(UIViewController*)visibleControllerForController:(UIViewController*)controller
{
    // Determine last controller in navigation stack
    UIViewController *topViewController = controller;
    if ([controller isKindOfClass:[UITabBarController class]]) {
        topViewController = ((UITabBarController*)controller).selectedViewController;
    }
    if ([controller isKindOfClass:[UINavigationController class]]) {
        topViewController = ((UINavigationController*)controller).topViewController;
    } else if (controller.navigationController) {
        topViewController = controller.navigationController.topViewController;
    }

    // If last controller is presenting a modal recurse - find the last controller in that navigation stack
    UIViewController *presentedViewController = topViewController.presentedViewController;
    if (presentedViewController && ! presentedViewController.isBeingDismissed) {
        return [[self class] visibleControllerForController:presentedViewController];
    }

    return topViewController;
}
0

Finally i resolve this issue by adding more code. like this...

UINavigationController *vc = SharedAppDelegate.navigationController;
    NSLog(@"%@",vc.viewControllers);
    UIViewController* controller = vc.viewControllers.firstObject;
    NSLog(@"%@",controller.childViewControllers);
    UIViewController* carbonContr = controller.childViewControllers.firstObject;
Shahbaz Akram
  • 1,598
  • 3
  • 28
  • 45