2011-11-05 2 views
6

이것은 초보자 용 질문 일지 모르지만 새로운 iOS 개발자입니다.navigationController.delegate를 변경하면 액세스가 잘못됩니다.

navigationController에 밀어 넣은보기가 있는데, 세 번째로 밀어 넣은보기라고 가정 해 보겠습니다. 해당보기에서 나는 self.navigationController.delegate = self;을 설정합니다. 사용자가 이전보기 (현재보기의 팝)로 이동할 때 대소 문자를 처리해야하므로 대리인이 변경되었습니다.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    if ([[viewController class] isEqual:[MainViewController class]]) { 
     ... 
    } 
} 

그것은 확인을 작동하지만 다시 버튼을 현재보기를 눌러 탐색을 다시 팝업 때 나쁜 액세스 오류를 받고 있어요 (즉, 첫 번째보기를 밀어로 전환).

그래서 내가 무엇을 놓치고 있습니까? 내비게이션 뒤로 버튼 누르기를 처리하는 올바른 방법은 무엇입니까?

답변

3

네비게이션 컨트롤러가 팝되고 할당 취소 된보기 컨트롤러에 메시지를 보내면 팝핑하고 푸시 할 때마다 위임자를 설정해야합니다. 또한 self.navigationController.delegate = nil;을 viewController의 dealloc 메소드에 추가하십시오. 의 ViewController에서 아래

+0

가, 3보기 UINavigationControllerDelegate를 구현 = 자기 self.navigationController.delegate을 할당 다른 사람들은? 그렇다면 모든 뷰에서 어디에서 대리인을 자기에게 설정해야합니까? – deimus

+1

만약 내가 올바르게 당신을 가지고 있다면 뷰에서 nil로 설정되어야한다. 적어도 해냈고 제대로 작동하는 것 같습니다. 확인하십시오. – deimus

+0

물론 각보기 컨트롤러에 대해 설정해야합니다. 확인. 대리자를 nil로 설정해야하는 이유는 포인터 (할당되지 않은 메모리에 대한 포인터)가 "dangling"되지 않도록하기 위해서입니다. EXC_BAD_ACCESS는 대개 할당 취소 된 객체에 메시지를 보내고 내비게이션 컨트롤러의 델리게이트가 해당 오류를 가져 오는 할당 해제 된 객체이므로 발생합니다. – Eugene

0

장소는 당신은 내 경우에는 ... 도움이되지 않았다 할당 해제에 델리게이트를 nil로 설정 실제로

-(void) viewWillDisappear:(BOOL) animated 
{ 
    [super viewWillDisappear:animated]; 
    if ([self isMovingFromParentViewController]) 
    { 
     if (self.navigationController.delegate == self) 
     { 
      self.navigationController.delegate = nil; 
     } 
    } 
} 
관련 문제