【问题标题】:get top visible view controller in objective c iOS在目标 c iOS 中获取顶部可见视图控制器
【发布时间】:2018-06-13 03:03:45
【问题描述】:

我正在实现这个方法,但它总是返回我的 rootviewcontroller,而不是当前的可见控制器,我怎样才能找到一个可见的控制器。我也关注这个链接。 iPhone -- How to find topmost view controller。但同样的问题呢。

    + (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];
}

【问题讨论】:

    标签: ios objective-c iphone uiviewcontroller


    【解决方案1】:

    我认为问题出在您的功能上。可能是您的根视图控制器不正确。尝试实现以下功能,看看它是否适合您:

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

    【讨论】:

    • 它返回给我 rootview 控制器
    • 它总是返回我作为 rootviewcontroller 的 slideNavigationController。不是我当前的视图控制器
    • 奇怪!!你能告诉我你的故事板吗?你是如何连接它的,那么你是如何呈现顶视图的?
    【解决方案2】:

    客观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()
    

    【讨论】:

    • 它返回给我 rootview 控制器
    • 转到下一个 ViewController 并检查它
    【解决方案3】:

    我认为你的逻辑不太正确。试试:

    +(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;
    }
    

    【讨论】:

      【解决方案4】:

      最后我通过添加更多代码解决了这个问题。像这样……

      UINavigationController *vc = SharedAppDelegate.navigationController;
          NSLog(@"%@",vc.viewControllers);
          UIViewController* controller = vc.viewControllers.firstObject;
          NSLog(@"%@",controller.childViewControllers);
          UIViewController* carbonContr = controller.childViewControllers.firstObject;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多