2012-07-30 2 views
1

웹 사이트와 유사한 탐색 메뉴가있는 iPad 응용 프로그램을 개발 중입니다. 일련의 단추가있는 화면 왼쪽의 메뉴를 상상해보십시오. 다른 컨트롤러가 표시된 단추를 누를 때마다.UIViewController 봉쇄가 올바르게 완료 되었습니까?

일부 그래픽 제약으로 인해 os에서 제공하는 컨테이너 컨트롤러를 사용할 수 없으므로 개념 상 비슷한 컨테이너 클래스를 UITabBarController에 작성하기로했습니다.

MAHomeController *home = [[MAHomeController alloc] initWithNibName:@"MAHomeController" bundle:nil]; 
[self addChildViewController:home]; 
[home didMoveToParentViewController:self]; 
homeIndex = [self.childViewControllers indexOfObject:home]; 
[home release]; 

MAConfigHomeController *config = [[MAConfigHomeController alloc] initWithNibName:@"MAConfigHomeController" bundle:nil]; 
[self addChildViewController:config]; 
[config didMoveToParentViewController:self]; 
configIndex = [self.childViewControllers indexOfObject:config]; 
[config release]; 

MAViewerHomeController *viewer = [[MAViewerHomeController alloc] initWithNibName:@"MAViewerHomeController" bundle:nil]; 
[self addChildViewController:viewer]; 
[viewer didMoveToParentViewController:self]; 
viewerIndex = [self.childViewControllers indexOfObject:viewer]; 
[viewer release]; 

당신은 내가 모든 추가 볼 수 있듯이 : 내가 사용하는 방법은 내가 이렇게 내 컨테이너의 초기화에서 addChildViewController:didMoveToParentViewController:

의 사용은 특히, 올바른 있는지 알고 싶습니다 콘텐츠 컨트롤러를 추가 한 후 즉시 didMoveToParentViewController:으로 전화하십시오. 이거 괜찮아? 이 때문에, 당신이 완료 블록에서 볼 수 있듯이

// some stuff removed for brevity, mostly configuration stuff 
UIViewController *fromCtrl = [self.childViewControllers objectAtIndex:currentIndex]; 
UIViewController *toCtrl = [self.childViewControllers objectAtIndex:index]; 
self.currentIndex = index; 
[self transitionFromViewController:fromCtrl toViewController:toCtrl duration:0.7 options:opts animations:^(void) {} completion:^(BOOL finished) { 
     if (completion) 
      completion(); 
    }]; 

, 내가 새로 전환 컨트롤러 didMoveToParentViewController:를 호출하지 않습니다

는 그런 내용 사이의 탐색을 처리하는 방법은 다음과 같이 무언가를 콘테이너의 childViewControllers에 앞서 추가된다. 또한 컨테이너 컨트롤러가 할당 해제 될 때까지 childViewCOntrollers 배열에 실제로 있기 때문에 이전 컨트롤러를 제거하지도 않습니다.

모든 이벤트는 3 개의 주요 컨트롤러 내에 중첩 된 하위 컨트롤러에도 올바르게 라우팅됩니다. 시뮬레이트 된 메모리 경고로 볼 수없는 컨트롤러의 뷰는 표시 될 때 언로드되고 다시로드되기 때문에 메모리도 문제가되지 않습니다.

이 디자인은 괜찮습니까?

+0

작동합니까? – Dustin

+0

예, 모든 이벤트가 보이는 컨트롤러로 라우팅되고 메모리가 올바르게 관리됩니다. –

+0

그렇다면이 문제는 발생하지 않습니다. 실제로 문제가 발생하면보다 구체적인 질문을 게시합니다. – Dustin

답변

1

iOS 개발 센터에서 View Controller 가이드를 읽은 경우 addChildViewController : 및 didMoveToParentViewController :에 제약이 없으므로 잘못된 작업을 수행하는 순서가 달라집니다.

내가 할 수있는 유일한 일은 잠재적으로 이것을 지연시켜 iOS가 실제로보기를 표시 할 때까지 닙을로드하지 않도록하는 것입니다. 부모 컨테이너를 초기화 할 때 프로파일 러를 실행하면 모든 닙을로드하게됩니다.

+1

문서가 명시되어 있지는 않지만 2012에서 뷰 컨트롤러에 대한 WWDC 세션을 사용하면 didMoveToParentViewController보다 먼저 addChildViewController를 호출해야합니다. 중간에 자식 뷰를 부모 뷰에 추가해야합니다. – jblocksom

관련 문제