2009-08-06 2 views
4

탐색보기 계층 구조의 컨텍스트에서보기를 전환 중입니다. 전환 시점에 이전보기가 새보기에서 푸시되고있는 것을 판별 할 수 있기를 원합니다.UINavigationControllers의 이전 visibleViewController를 확인하는 방법은 무엇입니까?

나는 UINavigationControllerDelegate이 노력하고있어 :

2009-08-05 20 : 05 : 21.274 앱 이름 [85913 : 20B] 에서 전환

(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    NSLog(@"Switching from %@ to %@", 
     NSStringFromClass([[navigationController visibleViewController] class]), 
     NSStringFromClass([viewController class]) 
    ); 
} 

을 나는이 얻을 ManagementScreen to ManagementScreen

불행히도 "will"이 호출되기 전에 유감스럽게도 "will"이 호출되기 전에 UINavigat 상태로 이미 스왑 아웃되어있는 것처럼 보입니다 같은 viewController 전달 된 ionController UINavigationController (및 또한 topViewController 속성, 여기 보여지지 않습니다 있지만 동일한 코드를 사용하여 시도한) visibleViewController 항상 동일합니다.

나는 네비게이션 뷰 컨트롤러를 확장하는 것을 피하고 싶습니다. 솔직히 델리게이트에 속성을 쉽게 넣을 수 있습니다. 그러나이 동작이 기존 프레임 워크 내에서 가능한지 궁금합니다 (전에 호출해야합니다. 무슨 일이 일어 났는지 후에 발생하지만, 네비게이션 컨트롤러의 상태가 어느 것보다 먼저 수정 된 것 같습니다.)

감사합니다.

+0

참고 : NSStringFromClass()를 사용하는 것이 더 간단합니다. –

답변

2
- (void)navigationController:(UINavigationController*)nc 
     didShowViewController:(UIViewController*)vc 
        animated:(BOOL)animated 
{ 
    NSLog(@"Switching from %@ to %@", 
    NSStringFromClass([vc class]), 
    NSStringFromClass([[nc.viewControllers objectAtIndex:[nc.viewControllers count]-1] class])); 
} 
+0

좋다. 항상 작동하지 않는다는 점을 제외하면, setViewControllers ::는 viewControllers 속성을 덮어 쓰며, 루트로 빠져 나오면 배열 경계를 이해할 수 없게된다. (물론 쉽게 피할 수 있지만, controller stack dunno!) – groundhog

+0

물론 당신은 경비원을 추가해야하고 어쨌든 루트를 뽑아 내면 안됩니다. setViewControllers에 관해서 - 그는 구체적으로 그가 자신의 주장을 추진하고 있다고 말했습니다. –

5
나는 문제가 지적 하듯, 시간에 의해 대리자가 표시됩니다 뷰 컨트롤러라고, 때문에 UINavigationControllerDelegate 작업을 사용하여 답변 이미 navigationController.topViewController에 대한 값을 생각하지 않는다

및 navigationController.visibleViewController.

대신 관찰자를 사용하십시오. 사전을 참조하는 사용자 정보 2. 알림에서 (viewControllerChange라는이 예에서는) 알림 콜백 사용 키를 생성

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(viewControllerChange:) name:@"UINavigationControllerWillShowViewControllerNotification" object:self.navigationController]; 

단계 :

단계 1. UINavigationControllerWillShowViewController 통지를 보는 관찰자 설정 마지막 및 다음보기 컨트롤러 :

(void)viewControllerChange:(NSNotification *)notification { 
    NSDictionary *userInfo = [notification userInfo]; 
    NSLog(@"Switching from %@ to %@", [[userInfo objectForKey:@"UINavigationControllerLastVisibleViewController"] class], [[userInfo objectForKey:@"UINavigationControllerNextVisibleViewController"] class]); 
} 
+0

이것은 실제로 작동합니다. 하지만 그 알림에 대한 문서를 찾을 수 없습니까? 앱을 제출하면 문제가 발생합니다. 그것을 사용하고 있습니까? – leolobato

+1

Nope. 문제가되지 않습니다. 알림은 API의 핵심 부분입니다. Apple은 "Cocoa Fundamentals Guide"에서 "객체와의 통신"절에서 이것을 설명합니다. –

+0

Dan에게 감사드립니다. UIViewController가 더 이상 스택에 없을 때 위임자가 호출하는 것이 좋습니다. –

관련 문제