본문 바로가기
아이폰 개발/ios 개념&튜토리얼

iOS 최상위뷰 체크 예제 - Curent RootViewController

by 인생여희 2021. 2. 8.

iOS 최상위뷰 체크 예제 - Curent RootViewController

 

 

용어 정리

 

1.rootViewController : 앱 최초 생성시 존재하는 ViewController. (앱을 실행시켰을때 처음 실행되는 뷰 컨트롤러).

 

2.presentedViewController : 그 위에 올려져 있는 뷰 컨트롤러.

 

 

applicationWillResignActive 메소드에서 현재 띄워진 뷰컨트롤러(rootViewController)를 파라미터로해서 visibleViewController 메소드의 인자로 넘긴다. visibleViewController 메소드 안에서는rootViewController.presentedViewController 를 isKindOfClass 메소드를 이용해서 네비게이션 컨트롤러 인지 탭바 컨트롤러인지 등을 체크해서 최상위 뷰 컨트롤러를 리턴해준다.

 

 

//앱이 곧 비활성화 될 것임을 알린다.
- (void)applicationWillResignActive:(UIApplication *)application
{
    
    NSLog(@"applicationWillResignActive - ");
    
    //최초의 뷰 컨트롤러 (기본뷰컨트롤러)
    UIViewController *uvc = [[[UIApplication sharedApplication] delegate].window rootViewController];
    
    NSLog(@"1. 최초의 rootViewController : %@" ,uvc);
    NSLog(@"2. 최상위 rootViewController : %@" , [self visibleViewController:uvc]);
    
}

//최상위뷰 컨트롤러 구하기
- (UIViewController *)visibleViewController:(UIViewController *)rootViewController
{
    
    NSLog(@"visibleViewController진입 -");
    NSLog(@"[*] 전달된 rootViewController :%@ " , [rootViewController class]);
    
   
    
    /*
        presentedViewController 가 nil 이면 즉,
        현재 ViewController 가 최상위 ViewControler 이면 자기자신 리턴
     */
    if (rootViewController.presentedViewController == nil)
    {
        NSLog(@"presentedViewController==nil");
        
        return rootViewController;
    }
    
    
    /* 네비게이션 컨트롤러 체크 */
    if ([rootViewController.presentedViewController isKindOfClass:[UINavigationController class]])
    {
        
        NSLog(@"UINavigationController -- ");
        
        UINavigationController *navigationController =
        (UINavigationController *)rootViewController.presentedViewController;
        
        NSLog(@"navigationController  :  %@ " , [navigationController class]);
        
        UIViewController *lastViewController = [[navigationController viewControllers] lastObject];

        return [self visibleViewController:lastViewController];
    }
    
    /* 탭바 컨트롤러 체크 */
    if ([rootViewController.presentedViewController isKindOfClass:[UITabBarController class]])
    {
        
        NSLog(@"UITabBarController -- ");
        
        UITabBarController *tabBarController = (UITabBarController *)rootViewController.presentedViewController;
        UIViewController *selectedViewController = tabBarController.selectedViewController;

        return [self visibleViewController:selectedViewController];
    }

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


    NSLog(@"visibleViewController - 끝");
    
    return [self visibleViewController:presentedViewController];

}

 

만약, rootViewController의 presentedViewControllernil 이라면, 현재 뷰 컨트롤러는 기본 뷰 컨트롤러를 의미한다.

 

nil 이 아니라면 올라간 뷰 컨트롤러를 if 구문을 통해 찾아서 원하는 작업을 수행할 수 있다.

 

 

 

현재 띄워진 뷰컨트롤러의 타입 또는 부모 타입 구하기

 

isMemberOfClass의 경우는 해당 인스턴스가 특정한 클래스의 타입인지를 확인한다.

 

isKindOfClass의 경우 해당 인스턴스가 특정 클래스의 상속 관계에 있어도 확인 가능하다.


 

    //현재 띄워진 class Name
    UIViewController *curentVC = [[[UIApplication sharedApplication] delegate].window rootViewController];
    
    //현재 띄워진 View가 ScreenSaverVC 와 같은 종류인지 체크
    BOOL checkCurVC  = [[curentVC presentedViewController] isMemberOfClass:[ScreenSaverVC class]];
    
    
    //최상위 뷰로 띄우기
    [[[[UIApplication sharedApplication] delegate].window rootViewController] presentViewController:
     
    [ScreenSaverVC sharedObject] animated:YES completion:nil];

 

 

참고

https://g-y-e-o-m.tistory.com/93

 

코드

https://stackoverflow.com/questions/22882078/how-to-get-visible-viewcontroller-from-app-delegate-when-using-storyboard

 

세그에 대해서

https://seizze.github.io/2019/11/23/iOS%EC%97%90%EC%84%9C-%EC%84%B8%EA%B7%B8%EB%A5%BC-%ED%86%B5%ED%95%9C-%ED%99%94%EB%A9%B4%EC%A0%84%ED%99%98-%EC%A0%95%EB%A6%AC.html