2009-08-14 6 views
2

내보기를 위해 수동으로 UINavigationBar를 관리하고 있습니다. Bar 자체와 첫 번째 UINavigationItem은 Interface Builder에서 생성됩니다. 내 코드에서 다양한 이벤트를 기반으로 새로운 탐색 항목을 막대 위에 놓고 적절한보기를 기본보기의 하위보기로 그립니다. 모두 괜찮아 보이지만, navbar back 버튼을 선택하면 두 개의 아이템이 예상했던 것보다 1이 아닌 아이템 스택에서 없어집니다. ,UINavigationBar가 "뒤로"스택에서 2 개의 항목을 팝하는 것처럼 보입니다.

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item; 

내가 바로 팝업 전에 발견
- (void)navigationBar:(UINavigationBar *)navigationBar didPopItem:(UINavigationItem *)item; 

에서, 탐색 모음의 항목이 올바른지 : 테스트하기 위해, 나는 바 및 트랩이 대리자 메서드의 대리인으로 내 컨트롤러 설정 예를 들어 3입니다. 팝업 된 항목이 마지막 항목인데도 pop 다음에 항목이 1 인 두 번째 방법에서 중간 항목이 누락되었습니다. 나는 이것을 디버깅하는 방법에 대해 잘 모르겠다. 그리고 어떤 아이디어라도 감사 할 것이다.

여러 가지 이유로 탐색 컨트롤러를 사용하지 않습니다.

답변

0

"저는 수동으로UINavigationBar를 관리하고 있습니다."

하지 마십시오. ;-)

진지하게. 나는 너 자신을 관리하는 좋은 이유를 생각할 수 없다. 그리고 당신이 아주 조심스럽지 않으면 전체 애플 리케이션을 다루기 힘들게 만드는 이슈들에 부딪 힐 것이다. 그렇다면 XIB에 연결된 루트보기에 UINavigationController를 만들지 않는 이유는 무엇입니까? 탐색 막대를 직접 관리하여 극복하려는 문제는 무엇입니까?

당신이 가지고있는 문제에 관해서는, 당신이 shouldPopItem에서 뭔가를하고 있기 때문에 2 개의 pop을 얻습니다. 이는 내비게이션 바를 직접 관리하려는 효과입니다. shouldPopItem과 didPopItem은 네비게이션 컨트롤러와 뷰가 아닌 네비게이션 바에 만 관련된다는 점에 유의하십시오. [[self navigationController] popViewControllerAnimated : YES]로 뷰 컨트롤러를 팝업 할 때; 그것은 shouldPopItem을 호출 할 것이다. 당신이 그것을 무시하고 있기 때문에 모든 것을 관리해야합니다.

+0

예, 감사 같은 경우. 아마도 뭔가가 didPopItem과 shouldPopItem을 두 번 호출하고 있다고 생각 했었습니다. 그래서 위임 메서드를 설정하여이를 트랩 할 수있었습니다. 그들은 한 번만 부름받습니다. 당시 내 viewcontroller를 확장하는 것이 내비게이션 컨트롤러를 구현하는 것보다 쉬워 보였습니다. IB가 이것을 설정하는 도구를 제공한다고 가정하면, 괜찮을 것이라고 생각했습니다. 또한 iphone dev에 상당히 익숙하며 프레임 워크 역학을 이해하고 싶습니다. 나는 지금 내 주위를 돌아 다녔고, 내 이해를 회피 한 환경을 가진 또 다른 것을이 백분율로 요약했다. – farhadf

0

shouldPopItemdidPopItem 방법의 시작 부분에 NSLog() 문을 입력하는 것으로 시작합니다. 이는 전화를받는 횟수와시기를 알려줍니다. 다음으로, 뷰 컨트롤러 스택의 크기를 앱 전체의 여러 위치에 기록 할 수 있으므로, 성장과 축소를 지켜 볼 수 있습니다. 이 두 가지가 작동하지 않으면 중단 점 배치를 시작하고 스택 추적을 확인하거나 컨트롤러 스택 크기를 수동으로 확인하십시오.

+0

고마워 - 나는 내 포스트에서 매우 깨끗하지 못했다 - 이것은 정확히 내가 한 일이다 - 중단 점을 설정하고 스택의 크기와 스택의 내용을 봅니다. 아주 이상한. – farhadf

0

UINavigationController과 같은 핵심 수업을 대체하거나 제외하는 것은 거의 불가능합니다. 나를 믿어 라. 나는 이것을 광범위하게 한 사람을 보았고, 앱에 문제가 닥쳤다. 나는 그들을 다루어야했다. UINavigationController.h을 살펴보십시오. 그것은 많은 돈을 관리하고 있습니다. 왜 당신은 자신의 네비게이션 바를 관리하려고합니까?

대신 특정 도면/레이아웃 메소드 만 재정의하려면 UINavigationBar과 같은 클래스를 "가볍게"서브 클래 싱하는 것이 허용됩니다. 이렇게하면 모든 복잡한 논리가 기본 클래스로 되돌아 갈 수 있습니다.당신은 어떤이 작업을 수행 할 수

#import <QuartzCore/QuartzCore.h> 
... 
- (void)viewDidLoad 
{ 
    UIImage * navigationBarContents = [UIImage imageNamed:@"navigation-bar"]; 
    self.navigationController.navigationBar.layer.contents = 
     (id)navigationBarContents.CGImage; 
} 

: 당신이 찾고있는 모두가, 말하자면, 그것으로 사용자 정의 이미지 스타일 인 경우

는 더 나은, 바로 탐색 모음의 contents 재산의 활용 UIView 하위 클래스를 사용하면 이미지를 사용하는 방식을 쉽고 깨끗하게 변경할 수 있습니다. 물론 사용자 정의 도면을 작성하는 경우 UINavigationBar의 하위 클래스로 바꾸고 -drawRect: 메소드 만 덮어 씁니다. 그런 다음 서브 클래스를 대신 UINavigationController 표준으로 사용하면 사용자 정의 스타일 탐색 막대에서만 모든 것이 정상적으로 작동합니다.

0

왜 UINavigationBar가 이와 같이 작동하는지 모르지만 까다로운 해결책이 있습니다.

- (BOOL)navigationBar:(UINavigationBar *)navigationBar 
    shouldPopItem:(UINavigationItem *)item 
{ 
    NSMutableArray *items = navigationBar.items.mutableCopy; 
    [items removeObject:item]; 

    // Now var 'items' contains the proper instances of UINavigationItem. To be exact, one more than the instances in 'navigationBar.items'. 

    return YES; 
} 
0

확인 poppage은 사용자 시작하거나 프로그램 그래서

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item 
{ 
    UIViewController *topViewController = self.topViewController; 

    ... some logic that justifies implementing shouldPopItem: delegate in the first place -> others have explained the caveats so I won't repeat that ... 

    // manual as in opposite of programmatic 
    BOOL manualPop = topViewController.navigationItem == item; 
    if(manualPop) { 
     [self popViewControllerAnimated:YES]; 
    } 
    return YES; 
} 
관련 문제