2009-07-02 8 views
7

내비게이션 스택 내부의 UIViewController가 드릴 다운 또는 드릴 업이 수행 되었기 때문에 표시되는지 여부를 감지 할 수있는 방법이 있습니까?UIViewController : 드릴 다운 및 드릴 업 감지

보기에서 UINavigationController의 topViewController 및 visibleViewController는 이미 새 ViewController로 설정되어 있습니다.

+0

나는 이것도 애써왔다. 도우미 클래스를 만들고 그것을 "스택의"UINavigationControllerDelegate로 만든 다음 "navigationController : willShowViewController :"를 통해보고 싶지만 두 가지 문제가 있습니다. 1) 푸시되지 않은 경우에도 호출되는 것 같습니다 (예 : 스택 오버 - 의심 스럽네요) 2) 이것은 관련 컨트롤러의 viewWillAppear 후에 호출됩니다. 뷰가 나타나기 전에 동일한 스택에 있는지 알 필요가 있기 때문에 논리 문제가 발생합니다. 이 접근 방식이 우아 해 보였으 나 막 다른 골목 이었기 때문에이 점을 지적하고 있습니다. –

답변

0

네비게이션 컨트롤러의 viewControllers 속성을 볼 수 없습니까?

+1

나는 두렵습니다. 현재보기 컨트롤러는 항상 배열의 마지막 항목입니다. 푸시 된 그 자체 또는 푸쉬 된 다른 컨트롤러의 결과로서 일어나는 것이 감지 될 수 없다. : ( – Norman

5

UINavigationController를 하위 클래스로 추가하고 didPushViewController 속성을 추가 할 수 있습니다. 그런 다음 pushViewControllerpopViewController을 재정 의하여 속성을 각각 true 또는 false로 올바르게 설정할 수 있습니다.

+0

좋은 소식입니다. 간과 한 쉬운 방법이 있다고 생각했습니다. 고마워요. – Norman

1

이전 및 다음보기 컨트롤러가 무엇인지 알아야합니까? 또는보기 컨트롤러가 튀어 나오거나 밀렸는지 여부를 구체적으로 알아야합니까? 당신은 UINavigationControllerDelegate에 의해 정의 된 다음과 같은 방법 구현할 수 있습니다

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    UIViewController * currentController = navigationController.visibleViewController; 
    UIViewController * nextController = viewController; 

    // Do whatever here. 
} 

그러나, 특정 뷰 컨트롤러가 튀어 나 밀렸다 여부를 알 필요가없는 경우를 다음 매트 다리 '제안 길을 가야하는 것입니다.

2

또 다른 방법은 클래스 로컬 변수로 드릴 다운하는 뷰 컨트롤러를 숨기고 나서 - viewWillAppear에서 클래스 로컬 변수 중 하나라도 설정되어 있으면 드릴 업으로 인해 조회수가 증가한 것입니다. 사용자가 어떤 컨트롤러를 반환했는지 알기조차하기 때문에 다른 로직을 사용할 수 있습니다 (드릴 다운 한 뷰 컨트롤러에서 변경된 값을 가져 오는 것과 같이).

viewWillAppear에서 참조를 해제하고 제외하면 시스템이 다시 정상적으로 인식되도록 재설정됩니다.

이 메커니즘은 드릴 다운 컨트롤러가 변경 사항을 푸시하는 대리자로 마스터보기를 알고있는 것보다 더 좋아요. 종종 데이터의 일부 작은 조각에 대해 작업하고 있으므로 전체 마스터 뷰 컨트롤러. 여러 다른 클래스에서 호출 할 수 있기 때문에 재사용이 쉬워집니다.

관련 문제