Как найти текущий видимый viewController в iOS

Мы знаем, если ваш viewController содержит UINavigationController,

вы можете найти свой текущий контроллер видимого представления с помощью 'self.navigationController.visibleViewController'.

Но я вам представляю контроллер представления, как найти текущий видимый контроллер?

Например :

code one :
------
AVClr *avclr = [[AVClr alloc]init] ;
AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate ;
appDelegate.window.rootViewController = avclr ;
[avclr presentViewController:loginNavClr animated:YES completion:nil] ;

---> сейчас отобразить avclr

code two:
------
AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate ;
UIViewController *currentVisibleViewController = appDelegate.window.rootViewController ;
BVClr *bvclr = [[BVClr alloc]init] ;
[currentVisibleViewController presentViewController:bvclr animated:YES completion:nil] ;

---> сейчас отобразить bvclr

code three:
------
AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate ;
UIViewController *currentVisibleViewController = appDelegate.window.rootViewController ;
CVClr *cvclr = [[CVClr alloc]init] ;
[currentVisibleViewController presentViewController:cvclr animated:YES completion:nil] ;

---> Ошибка, не удается отобразить cvclr, поскольку avclr является rootViewController, а avclr присутствует bvclr, поэтому отображается bvclr.

Вопрос:

Но мы знаем код 3 в другом .m файле, поэтому мы не знаем, кто является rootViewController. поэтому, если я представлю cvclr, результат будет неожиданным!

В данных обстоятельствах, как отобразить cvclr


person user5465320    schedule 25.10.2016    source источник


Ответы (4)


чтобы найти текущий контроллер вида сверху, я использовал этот метод

- (UIViewController *)currentTopViewController
{
   UIViewController *topVC = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
   while (topVC.presentedViewController)
   {
     topVC = topVC.presentedViewController;
   }
   if ([topVC isKindOfClass:[UINavigationController class]]) {
      return [(UINavigationController *)topVC topViewController];
   }
  return topVC;
}
person Prashant Tukadiya    schedule 25.10.2016

Если вы представляете следующий экран из этого класса, вам не нужно извлекать контроллер вида сверху из UIWindow Просто используйте это..

 -----------------
AVClr *avclr = [[AVClr alloc]init];
[self presentViewController: avclr animated:YES completion:nil] ;

------------------------------


BVClr *bvclr = [[BVClr alloc]init] ;
[self.presentingViewControler presentViewController:bvclr animated:YES completion:nil] ;

------------------


CVClr *cvclr = [[CVClr alloc]init] ;
[self.presentingViewControler presentViewController:cvclr animated:YES completion:nil] ;
person Syed Qamar Abbas    schedule 25.10.2016

Этот код также проверяет UITabbarViewContoller :

-(UIViewController *) getVisibleViewContoller {
    UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController;
    if (!rootViewController) {
        return nil;
    }
    if ([rootViewController isKindOfClass:[UITabBarController class]]) {
        UITabBarController *tabbarVC = (UITabBarController *) rootViewController;
        UIViewController *selectedVC = tabbarVC.selectedViewController;
        if (selectedVC) {
            if (![selectedVC isKindOfClass:[UINavigationController class]]) {
                return selectedVC;
            }
            rootViewController = selectedVC;
        }
    }
    if ([rootViewController isKindOfClass:[UINavigationController class]]) {
        UINavigationController *navigationVC = (UINavigationController *) rootViewController;
        if (navigationVC.topViewController) {
            return navigationVC.topViewController;
        }
        return navigationVC.viewControllers.lastObject;
    }
    return rootViewController;
}
person Hussein Habibi Juybari    schedule 02.06.2018

person    schedule
comment
Это помогло? Я не проверял это, но написал код только здесь.. Так что исправьте, если какой-то синтаксис неверен.. Но вы получите основную идею.. - person Krishna Kumar; 25.10.2016