iOS 는 어떻게 최상 위 뷰 컨트롤 러 에 대한 상세 한 설명 을 가 져 옵 니까?

1 현재 화면 에 표 시 된 Viewcontroller 가 져 오기

//         viewcontroller
- (UIViewController *)getCurrentVC
{
 ///      
 UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
 UIViewController *currentVC = [self getCurrentVCFrom:rootViewController];
 return currentVC;
}

- (UIViewController *)getCurrentVCFrom:(UIViewController *)rootVC
{
 UIViewController *currentVC;
 if ([rootVC presentedViewController]) {
  //     presented   
  rootVC = [rootVC presentedViewController];
 }

 if ([rootVC isKindOfClass:[UITabBarController class]]) {
  //     UITabBarController
  currentVC = [self getCurrentVCFrom:[(UITabBarController *)rootVC selectedViewController]]; 
 } else if ([rootVC isKindOfClass:[UINavigationController class]]){
  //     UINavigationController
  currentVC = [self getCurrentVCFrom:[(UINavigationController *)rootVC visibleViewController]]; 
 } else {
  //          
  currentVC = rootVC;
 }
 
 return currentVC;
}
2 분석
2.1 UIApplication 에 대한 분석
UIApplication 의 핵심 역할 은 iOS 프로그램 이 실행 되 는 동안 제어 와 협력 작업 을 제공 하 는 것 입 니 다.모든 프로그램 은 실행 기간 에 하나의 UIApplication(또는 하위 클래스)인 스 턴 스 만 있어 야 합 니 다.프로그램 이 실 행 될 때 main 함수 에서 UIApplication 의 단일 인 스 턴 스 를 만 듭 니 다.코드 에서[UIApplication shared Application]을 호출 하여 이 인 스 턴 스 의 지침 을 얻 을 수 있 습 니 다.
2.2  KeyWindow  간략 하 다
KeyWindow 를 간략하게 분석 하기 전에 UIWindow 의 개념 을 살 펴 보 겠 습 니 다.
UIWindow 는 UIView 의 하위 클래스 로 UIView 에 보기 등급,관리 보기,전달 UIEvent 대상 의 속성 과 Method 등 을 추가 합 니 다.
상술 한 실례 에서 우 리 는 통과 했다  [UIApplication shared Application]에서 가 져 온 UIApplication 의 단일 인 스 턴 스 대상 을 인 스 턴 스 대상 의 keyWindow 를 통 해 현재 활성 화 된 window(또는 현재 표 시 된 주 창)를 가 져 옵 니 다.
KeyWindow 란 IOS 개발 에서 활성 화 된 창,즉 키보드 와 비 터치 이 벤트 를 받 을 수 있 는 창 을 말 합 니 다.한 번 에 하나의 KeyWindow 만 있 을 수 있 습 니 다.IOS 개발 에 서 는 UIWindow Level 의 수 치 를 설정 하여 맨 앞 에 있 는 창 을 설정 할 수 있 습 니 다.Level 수치 가 높 은 창 이 앞 에 있 을 수록 두 창의 Level 등급 이 같 으 면,MakeKey AndVisible 을 통 해 KeyWindow 를 표시 할 수 있 습 니 다.
(void)makeKeyWindow;//현재 UIWindow 를 keyWindow(주 창)로 변경
(void)makeKeyAndVisible;//현재 UIWindow 를 keyWindow 로 만 들 고 표시
[UIApplication shared Application].windows//현재 응용 프로그램의 모든 UIWindow 가 져 오기
[UIApplication shared Application].keyWindow//현재 응용 프로그램의 주 창 가 져 오기
view.window//어떤 UIView 가 있 는 UIWindow 를 가 져 옵 니 다.
MakeKey AndVisible 과 MakeKeyWindow 
  • MakeKeyWindow:현재 창 을 주요 창 으로 만 드 는 일 만 했 습 니 다.현재 창 이 반드시 표시 되 는 것 은 아 닙 니 다
  • MakeKey AndVisible:현재 창 을 주요 창 으로 만 들 고 현재 창 을 표시 하 는 두 가지 일 을 했 습 니 다.표시 만 하려 면 속성 hidden 을 NO 로 설정 하면 됩 니 다.=
  • becomeKeyWindow 와 resignKeyWindow
  • becomeKeyWindow:프로그램 이 자동 으로 호출 되 어 다른 창 에 현재 용기 가 주 창 으로 설정 되 어 있 음 을 알 립 니 다.우 리 는 이 방법 을 주동 적 으로 호출 하지 않 습 니 다.이 방법 은 시스템 이 자동 으로 호출 하여 알림 을 보 내 는 것 입 니 다.이 방법 은 기본적으로 어떠한 조작 도 수행 하지 않 지만 하위 클래스 는 이 를 덮어 쓰 고 관건 적 인 창 이 되 는 작업 을 수행 할 수 있 습 니 다
  • resignKeyWindow:becomeKeyWindow 와 유사 합 니 다.알림 창 에서 홈 키 창의 신분 을 취소 할 것 입 니 다.같은 방법 으로 직접 호출 하지 마 십시오
  • 2.3 rootViewController 속성
    말 그대로 현재 창의 루트 보기
    현재 UIWindow 만 rootViewController 라 는 속성 이 있 습 니 다.UINavigationController 의 루트 보기 개념 과 혼동 하지 마 십시오.
    UINavigationController 는 사실 rootViewController 라 는 속성 이 없습니다!자체 적 인 setter 방법 도 없다.루트 보 기 를 설정 하려 면 다음 과 같은 방법 만 사용 할 수 있 습 니 다.
    
    - (instancetype)initWithRootViewController:(UIViewController *)rootViewController; 
    
    uiwindow 의 루트 보기 가 져 오기
    방식 1
    
    AppDelegate *app =(AppDelegate *) [UIApplication sharedApplication].delegate;
    UIViewController *rootViewController1 = appdelegate.window.rootViewController;
    
    방식 2
    
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    UIViewController *rootViewController2 = window.rootViewController;
    
    
    주의해 야 할 것 은:
    방식 2 에서 UIAlertController,UIAlertView,UIActionSheet 이 팝 업 되면 상기 View 는 새로운 window 를 생 성하 고 인터페이스 에 추가 하기 때문에 keyWindow 는 UIAlertController Shim PresenterWindow 와 같은 종류 가 됩 니 다.
    2.4 PresentedViewController 간략 분석
    ios 개발 에서 일반 페이지 의 구성 은 NavigationController 가 있다.  아니면 다른 UiViewController,UITabViewController 등...
  • NavigationController 네 비게 이 션 표시 줄 이 있 으 면[self.navigationColler pushviewController:animated:]를 사용 하여 다음 보기 로 들 어가 고[self.navigationController popView Controller Animated:]를 사용 하여 이전 보기 로 돌아 갑 니 다
  • NavigationController 네 비게 이 션 표시 줄 이 없 을 때[self presentView Controller:animated:completion:]을 사용 하여 다음 보기 로 들 어가 서[self dismissView Controller Animated:completion:]을 사용 합 니 다.이전 보기 로 되 돌아 갑 니 다
  • presented ViewController 와  presentingViewController
    사례 설명 A.presented ViewController A 컨트롤 러 가 B 컨트롤 러 로 넘 어 갑 니 다.B.presenting View Controller 는 A 컨트롤 러 로 돌아 가 는 것 입 니 다.
    총결산
    iOS 가 최상 위 뷰 컨트롤 러 를 어떻게 가 져 오 는 지 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 iOS 가 최상 위 뷰 컨트롤 러 를 가 져 오 는 내용 은 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기