【问题标题】:Get top UIViewController when use SWRevealViewController使用 SWRevealViewController 时获取顶部 UIViewController
【发布时间】:2016-03-27 01:32:57
【问题描述】:

我的项目使用SWRevealViewController 和标签栏控制器。我使用下面的代码来获取可见的视图控制器:

- (UIViewController*) topMostController
{
    return [self topViewControllerWithRootViewController:[UIApplication sharedApplication].keyWindow.rootViewController];
}

- (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController {
    if ([rootViewController isKindOfClass:[UITabBarController class]]) {
        UITabBarController* tabBarController = (UITabBarController*)rootViewController;
        return [self topViewControllerWithRootViewController:tabBarController.selectedViewController];
    } else if ([rootViewController isKindOfClass:[UINavigationController class]]) {
        UINavigationController* navigationController = (UINavigationController*)rootViewController;
        return [self topViewControllerWithRootViewController:navigationController.visibleViewController];
    } else if (rootViewController.presentedViewController) {
        UIViewController* presentedViewController = rootViewController.presentedViewController;
        return [self topViewControllerWithRootViewController:presentedViewController];
    } else {
        return rootViewController;
    }
}

但是当我站在MessageViewController 或其他任何位置时,我总是以SWRevealViewController 为顶部。请纠正我在这种情况下获取可见视图控制器的正确方法。

【问题讨论】:

  • 你有没有找到解决方案?
  • @Hemang: 是的,但是现在很忙,想发布我的答案来帮助另一个面临同样问题的人。
  • 如果您发布对每个人都有帮助的答案,那就太好了。

标签: ios swrevealviewcontroller


【解决方案1】:
  • 在使用带有标签栏的 SWRevealController 时检查层次结构并进行相应的导航。

它的 SWRevealController->tabbarcontroller->navigationcontroller->导航控制器中的lastobject。如果不同,相应调整。例如,提供了具有此层次结构的代码。

(UIViewController*) visibleViewControllerWhenUsingSWRevealController  {

    if ([swRevealController.frontViewController isKindOfClass:[UITabBarController class]]) {

        UITabBarController *tabBarController = (UITabBarController *)mainRevealController.frontViewController;

        if ([tabBarController.selectedViewController isKindOfClass:[UINavigationController class]]) {
             UINavigationController *navigationController = tabBarController.selectedViewController;
             return ( [[navigationController viewControllers] lastObject]) ;
        }
    }  

    return nil;
}

【讨论】:

    【解决方案2】:

    希望这将有助于找出SWRevealViewControllerfrontViewController

    - (UIViewController*)topViewController {
        UIViewController *view= [self topViewControllerWithRootViewController:[UIApplication sharedApplication].keyWindow.rootViewController];
        return view;
    }
    
    
    - (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController {
        if ([rootViewController isKindOfClass:[UITabBarController class]]) {
            UITabBarController* tabBarController = (UITabBarController*)rootViewController;
            return [self topViewControllerWithRootViewController:tabBarController.selectedViewController];
        } else if ([rootViewController isKindOfClass:[UINavigationController class]]) {
            UINavigationController* navigationController = (UINavigationController*)rootViewController;
            return [self topViewControllerWithRootViewController:navigationController.visibleViewController];
        }else if ([rootViewController isKindOfClass:[SWRevealViewController class]]) {
            SWRevealViewController* viewcontroller = (SWRevealViewController*)rootViewController;
            return [self topViewControllerWithRootViewController:viewcontroller.frontViewController];
        }
    
        else if (rootViewController.presentedViewController) {
            UIViewController* presentedViewController = rootViewController.presentedViewController;
            return [self topViewControllerWithRootViewController:presentedViewController];
        } else {
            return rootViewController;
        }
    }
    

    【讨论】:

      【解决方案3】:

      我知道回答这个问题已经很晚了,但也许这会对某人有所帮助,因为我最近无法找到解决方案。我的答案是针对 swift 用户:

      extension UIApplication {
      class func topViewController() -> UIViewController? {
          var topVC = shared.keyWindow!.rootViewController
          while true {
              if let presented = topVC?.presentedViewController {
                  topVC = presented
              } else if let nav = topVC as? UINavigationController {
                  topVC = nav.visibleViewController
              } else if let tab = topVC as? UITabBarController {
                  topVC = tab.selectedViewController
              }else if let swRVC = topVC as? SWRevealViewController {
                  topVC = swRVC.frontViewController
              } else {
                  break
              }
          }
          return topVC
      }
      }
      

      【讨论】:

      • 精湛的 Khan Sab...!!
      猜你喜欢
      • 2016-06-13
      • 2011-05-03
      • 2015-04-16
      • 2017-05-20
      • 2023-03-28
      • 2016-10-27
      • 2015-05-18
      相关资源
      最近更新 更多