2009-02-07 2 views
3

응용 프로그램이 시작될 때 두 개의보기 컨트롤러 (InfoEditor 및 MonthlyPlan)를로드하는 viewController (Planner)가 있습니다. MonthlyPlan은 InfoEditor 뒤에 숨어 있습니다 (로드 중).보기 컨트롤러가보기 스택 맨 위로 가져 왔을 때 코드 업데이트를 실행하려면 어떻게합니까?

내 질문은 MonthlyPlan InfoEditor를 교환 할 때 (MonthlyPlan이 맨 위로 가져옴) MonthlyPlan보기의 데이터를 어떻게 갱신 할 수 있습니까? viewDidLoad의 NSLog는 응용 프로그램이 시작될 때 호출됩니다 (의미가 있습니다.). viewDidAppear 및 viewWillAppear의 NSLog는 아무 것도하지 않습니다.

아이디어가 있으십니까?

감사합니다.

- 세부 정보 추가 -

직접 뷰 계층 구조를 만들고 있습니다. 다른 두 viewController를로드하는 간단한 viewController. 두 아이 viewControllers 동시에로드 나는이 코드를 사용하고 두 의견을 교환하기 위해 (응용 프로그램의 실행에.) :

[self.view exchangeSubviewAtIndex:1 withSubviewAtIndex:0]; 

다음은 뷰의 교환하는 것은 괜찮습니다. 누락 된 부분은 하위보기를 말하고, 사용자가 앞에 있고, 일부 속성을 업데이트하는 일부 방법 일뿐입니다.

+0

viewWillAppear 또는 viewDidAppear가 수행해야하는 작업 ... 매우 이상합니다. –

답변

5

여기에 세부 정보가 부족합니다. 두 견해를 어떻게 "교환하고 있습니까?"

UINavigationController를 컨테이너로 사용하는 경우 새로운 viewController를 밀거나 팝 할 때마다 viewWillAppear/viewDidAppear가 호출됩니다. 이러한 호출은 UINavigationController 자체에 의해 수행됩니다. UINavigationController를 사용하고 있다면이 함수들에 맞는 프로토 타입을 가지고 있는지 확인하십시오.

- (void)viewWillAppear:(BOOL)animated 

뷰 계층 구조를 직접 구현하려는 경우보기를 활성화/비활성화 할 때 이러한 호출을 직접 수행해야 할 수 있습니다. viewWillAppear의 SDK 페이지에서;

도면 제어기에 속하는 뷰 계층 직접 뷰에 추가되는 경우, 제어기는도 이 메시지를 수신하지 않을 것이다. 보기 보기 계층에보기를 추가하거나 추가하면 해당보기 컨트롤러는 이고, 연결된보기 컨트롤러는 입니다.이 메시지를 직접 보내야합니다.

업데이트 : 새로운 세부 사항으로

문제가 분명하다 :이 SDK에 의해 제안 당신이 나타납니다/사라 메시지를 직접 보내야합니다 상황이다. 이러한 함수는 뷰가 직접 삽입/제거/변경 될 때 자동으로 호출되지 않으며 계층 지원을 제공하는 상위 수준 코드 (예 : UINavigationController)에서 사용됩니다.

exchangeSubView를 사용하는 예를 생각해 보면 아무 것도 사라지지 않고, 하나의보기가 지역 및 불투명도에 따라 전체적으로 또는 부분적으로 표시됩니다.

내가보기를 바꾼다면 필요에 따라 실제로 제거/추가하고 해당 컨트롤러에 viewWillAppear/viewWillDisappear 알림을 수동으로 보냅니다.

예.

// your top level view controller 
-(void) switchActiveView:(UIViewController*)controller animated:(BOOL)animated 
{ 
    UIController* removedController = nil; 

    // tell the current controller it'll disappear and remove it 
    if (currentController) 
    { 
     [currentController viewWillDisapear:animated]; 
     [currentController.view removeFromSuperView]; 
     removedController = currentController; 
    } 

    // tell the new controller it'll appear and add its view 
    if (controller) 
    { 
     [controller viewWillAppear:animated]; 
     [self.view addSubView:controller.view]; 
     currentController = [controller retain]; 
    } 

    // now tell them they did disappear/appear 
    [removedController viewDidDisappear: animated]; 
    [currentController viewDidAppear: animated]; 
    [removedController release]; 
} 
+0

더 많은 의견을 남겼습니다. CA는 "[보내기] 관련 뷰 컨트롤러 [직접] 메시지에 대해 좀 더 자세히 설명합니다." –

+0

아름답게 운동했습니다. 제거/추가 후 교환하는 방법이 훨씬 현명합니다. 감사합니다 앤드류. –

0

각 하위 뷰에 updataData 메서드를 추가하고 동시에 가져 오는 것이 좋습니다. 활성 서브 뷰를 추적하려면 변수를 루트보기 컨트롤러에 추가해야합니다.

[self.view exchangeSubviewAtIndex:1 withSubviewAtIndex:0]; 
if (subView1IsActive) [subView1Controller updateData]; 
else [subView2Controller updateData]; 
관련 문제