2013-06-15 6 views
1

자식보기 컨트롤러 및 여러보기를 프로그래밍 방식으로 인스턴스화하는 사용자 지정 컨테이너 컨트롤러를 작성하고 있습니다. 또한 하위 뷰 컨트롤러는 프로그래밍 방식으로 뷰를 인스턴스화 한 다음 addSubview를 사용하여 컨테이너의 뷰 계층 구조에 수동으로 추가합니다.viewDidLoad 대 사용자 지정 컨테이너 컨트롤러의 loadView

제 질문은 내 컨테이너 컨트롤러의 코드에서 내 자식보기 컨트롤러와 컨테이너 컨트롤러에 의해 직접 제어되는보기를 모두 인스턴스화하는 것입니다.

로드 뷰는 프로그래밍 방식으로 작업 할 때 뷰 계층 구조를 생성해야하는 곳이지만 하위 계층의 뷰를 뷰 계층 구조에 추가해야한다는 것을 알고 있습니다. 자식 컨트롤러가 생성 될 때 자식 컨트롤러의 뷰가 인스턴스화되므로 자식 컨트롤러를 먼저 만들어야합니다. 그렇다면 loadView에서 하위 컨트롤러를 만든 다음 뷰를 뷰 계층 구조에 추가합니까? 그것은 틀린 것처럼 보인다.

지금은 viewDidLoad에서 하위보기 컨트롤러를 만든 다음보기 계층을 작동시키는보기 계층 구조에 추가했지만 전체 계층 구조가 loadView에서 구성되어야하는 모든 곳을 읽었습니다. 이것을 처리하는 적절한 방법은 무엇입니까? 다음로드 뷰에서

일부 컨테이너를 설정할 :

(이 예제는 공개 슬쩍 수있는, 주요 내용 아래 탐색 메뉴를 생성)

답변

0

이 방법을 사용해보십시오.

- (void)loadView 
{ 
    CGRect fullScreen = [UIScreen mainScreen].bounds; 
    CGRect statusBarFrame = [UIApplication sharedApplication].statusBarFrame; 
    self.view = [[UIView alloc] initWithFrame:CGRectMake(0, statusBarFrame.size.height, fullScreen.size.width, 
      fullScreen.size.height - statusBarFrame.size.height)]; 
    [self.view setAutoresizingMask:UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth]; 

    _mainNavigationContainer = 
      [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width - 60, self.view.frame.size.height)]; 

    [_mainNavigationContainer setHidden:YES]; 
    [self.view addSubview:_mainNavigationContainer]; 

    _mainContentViewContainer = [[GGMainContentContainer alloc] initWithFrame:self.view.bounds]; 
    [_mainContentViewContainer setNavigationDelegate:self]; 
    [self.view addSubview:_mainContentViewContainer]; 

} 

그 일을하는 데, 자식 컨트롤러 (들)

  • 을 받아 들일 수있는 방법을 만들 당신이해야 컨테이너의 경계에 뷰의 프레임을 설정 해당 컨테이너에 자식 컨트롤러의보기에서 .
  • 컨테이너 뷰 컨트롤러가 있어야하며 사용 기간 동안 하위 컨트롤러를 유지해야합니다.

코드 : 여기

- (void)setMainNavigationController:(UIViewController*)mainNavigationController 
{ 
    _mainNavigationController = mainNavigationController; 
    [_mainNavigationController.view setFrame:_mainNavigationContainer.bounds]; 
    [_mainNavigationController willMoveToParentViewController:self]; 
    [_mainNavigationContainer addSubview:_mainNavigationController.view]; 
    [_mainNavigationController didMoveToParentViewController:self]; 
} 

런타임 여기

- (void)pushViewController:(UIViewController*)viewController replaceRoot:(BOOL)replaceRoot 
{ 
    if ([_controllerStack peek] == nil) 
    { 
     [_controllerStack push:viewController]; 
     [_mainContentViewContainer setContent:viewController.view navigationBarOrNil:[self makeNavigationBarForTopController]]; 
    } 
    else 
    { 
     if (replaceRoot) 
     { 
      [_controllerStack removeAllObjects]; 
     } 
     [self slideToViewController:viewController direction:GGSlideAnimationDirectionFromRight]; 
    } 
} 

에서 주요 컨테이너를 애니메이션의 예는 도움이 될 몇 가지 슬라이드와 샘플입니다 :

https://speakerdeck.com/peterfriese/ios-5-uiviewcontroller-containment