2009-05-28 4 views
4

그래서 누군가가 UINavigationControler의 뒤로 버튼을 건 드리면 데이터 소스를 업데이트하기 위해 일부 코드를 실행하고 싶습니다.UINavigationController intercepting - popViewControllerAnimated :

문제는 제가 할 수없는 일은 올바른 대리인을 찾는 것입니다. 이들 만 nav 컨트롤러 대리자에서 사용할 수 있으며 'didfinishshowing'형식 메서드가 필요합니다.

– navigationController:willShowViewController:animated: optional method 
– navigationController:didShowViewController:animated: optional method 

내가 생각한 다음 최고의 장소는 탐색 바 였지만 그 때 시도해 보았습니다. 때문에 캐치되지 않는 예외 'NSInternalInconsistencyException', 이유는 응용 프로그램 종료

: '수동 UINavigationBar에 대리자를 설정할 수 없습니다 돈 당신으로,이 후 향적으로 의미가

컨트롤러에 의해 관리 어떤 해커가 nav 컨트롤러의 내부를 어지럽히고 작동을 멈추고 싶습니다.

이 문제는 공통적으로 발생해야하며 간단합니다.

+0

이 솔루션은 아니지만 UINavigationController가 스토리 보드에서 인스턴스화되면 NSInternalInconsistencyException을 얻지 못한다는 사실을 발견했습니다. – hyperspasm

+0

또한 UINavigationController에 사용자 지정 UINavigationBar 하위 클래스를 만들 수도 있습니다 (예 :UINavigationBar 서브 클래스에서'- (UINavigationItem *) popNavigationItemAnimated : (BOOL) animated'를 오버라이드 (override)합니다. – hyperspasm

답변

5

표시 할 View Controller의 viewWillAppear : (BOOL) 애니메이션 메서드에 새로 고침 코드를 추가하십시오. 귀하의 경우에는 이미 탐색 스택에있는보기 컨트롤러입니다.

+2

2011 년 5 월, iOS 4.2에서 여전히 유일한 답변입니까? 정말 끔찍하네요. 그렇죠? – epologee

10

우리는 분명합니다.보기 A가 출발점입니다. 사용자가 무언가를 탭하면 오른쪽으로 슬라이드하여 B를 볼 수 있습니다. 사용자가 뒤로 버튼을 탭하면 B에서 A로 돌아가고 '뒤로'작업의 결과로 무언가를하고 싶습니다.

그것을 할 수있는 세 가지 방법이 있습니다 (그리고에이 둘 다없는 당신이있는 navigationController 가까이 가야 할 - 이러한 기본 viewControllers 자체에 적용) :

  • dmercredi 뷰 컨트롤러 A를 viewWillAppear를 오버라이드 (override)에서 알 수 있듯이 그래서 당신이 그것으로 돌아갈 때, 그것은 스스로를 리프레시합니다. 문제는 A가 처음 호출 될 때 viewWillAppear이 호출되기도한다는 것입니다. 따라서 첫 번째 viewWillAppear과 그 이후의 모든 것을 구별하기 위해 일종의 플래그를 설정해야합니다.

  • viewWillDisappear을보기 컨트롤러 B에서 덮어 쓰고 새로 고침하십시오. B가 사라질 때만 호출됩니다. B 위에 한 단계 더 깊게 들어가거나 위에 모달 대화 상자를 가져 오는 무언가가 있다면 viewWillDisappear이 다시 호출 될 것입니다. 따라서 다시오고가는 것을 구별해야합니다.

  • 다양한보기를 디커플링하고 위임 패턴을 사용하십시오. 뷰 컨트롤러 A는 자신을 B의 위임자로 설정하고 B가 무언가를 업데이트하면 위임 메서드를 호출하므로 A에 변경 사항이 통보되고 필요에 따라 업데이트 할 수 있습니다. 사용자가 B 내에서 변경하거나 을 무시할 때마다 위임 메서드를 호출 할 수 있으며 한 번만 처리 할 수 ​​있습니다.

관련 문제