2015-12-21 4 views
0

Мой проект использует SWRevealViewController с контроллером панели вкладок. И я использую ниже код, чтобы получить видимый контроллер представления:Получить верхний UIViewController при использовании 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 на вершине. Пожалуйста, исправьте меня правильно, чтобы получить видимый контроллер в этом случае.

+0

Вы когда-нибудь найти решение для этого? – Hemang

+0

@Hemang: Да, но теперь так занят, чтобы опубликовать свой ответ, чтобы помочь другому, кто сталкивается с той же проблемой. – lee

+0

Было бы здорово, если бы вы опубликовали свой ответ, который будет полезен всем. – Hemang

ответ

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; 
} 
0

Надеется, что это поможет выяснить frontViewController из SWRevealViewController

- (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; 
    } 
} 
Смежные вопросы