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의 presentedViewController가 nil 이라면, 현재 뷰 컨트롤러는 기본 뷰 컨트롤러를 의미한다.
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
코드
세그에 대해서
'아이폰 개발 > ios 개념&튜토리얼' 카테고리의 다른 글
iOS 배달앱 개발 예제(1) - (feat. CoreLocation, NSTimer, NSURLSession) (0) | 2021.02.09 |
---|---|
iOS CoreLocation 공통 모듈 - 싱글톤 (0) | 2021.02.09 |
iOS 공통로그 & pch 파일 (0) | 2021.02.08 |
iOS UNNotificationServiceExtension 예제 Push Sound (1) | 2021.02.05 |
iOS 화면보호기 예제 (0) | 2021.02.03 |