2011-03-05 2 views
1

좋아, 지금 당장 initWithCoder를 얻으려고 많은 문제를 겪고있다. 로드 된 nib 파일이 있고 내 응용 프로그램 대리자에서 unarchiveWithFile : 해당 펜촉 함께 연결된보기 컨트롤러에 대한 호출하고 지금 내 응용 프로그램이 충돌합니다. initWithCoder :가 awakeFromNib :가 호출 될 때부터 한 번, 그리고 unarchiveWithFile을 호출 할 때부터 두 번 호출되는 것을 볼 수 있습니다. 뷰 컨트롤러가 NSCoding을 준수하기 때문입니다. 하지만 뷰가로드되거나 IBOutlet을 누를 때 충돌이 발생합니다. 어떤 제안 ??initWithCoder : nib 및 NSCoding에서 호출 중입니다!

편집 :

- (id)initWithCoder:(NSCoder *)coder { 
    [super initWithCoder:coder]; 
    [[self mapView] addAnnotations:[[coder decodeObjectForKey:@"Annotations"] retain]]; 
    return self; 
} 

나는지도보기위한 주석의 배열을 디코드하고있어 모든하지만 어딘가에 선을 따라이 방법은 두 번 호출하고되고이 후 충돌 : 여기 initWithCoder의 코드는 .

+0

오류 로그에 무엇이 기록되어 있습니까? – Jensen2k

+0

지금 당장은 디버거가 "EXC_BAD_ACCESS"라고 말하는 것입니다. – evanskis

답변

0

당신은

- (id)initWithCoder:(NSCoder *)coder { 
    if(self == nil) 
    { 
      [super initWithCoder:coder]; 
      [[self mapView] addAnnotations:[[coder decodeObjectForKey:@"Annotations"] retain]]; 
    } 
     return self; 
} 

나는이 작동하는지 모르겠습니다 시도 할 수 있습니다.

+0

이 방법은 상처를 고치는 대신 가난한 고집 플라스틱을 고집하려고합니다. – occulus

1

init 메소드에 nil 체크를 넣는 것을 잊지 마십시오. 예 : 문제의 원인이 아니다

- (id)initWithCoder:(NSCoder *)coder { 
    if (self = [super initWithCoder:coder]) { 
     [[self mapView] addAnnotations:[[coder decodeObjectForKey:@"Annotations"] retain]]; 
    } 
    return self; 
} 

그러나 : 당신이로 쓴 경우 게시 된 방법이 더 정확한 것입니다.

보기 컨트롤러를 직접 보관 취소해야하는 이유가 있습니까? 특별한 일을하지 않는다면, 기존 메커니즘을 사용하여 수행 할 수 있습니다. UIViewController에 대한 init의 기본 구현은 뷰 컨트롤러와 동일한 이름을 가진 펜촉을 찾고, 존재하면 펜촉을 (initWithNibName을 통해)로드합니다.

아카이브에 필요한 데이터가있는 경우 실제로는 UIViewController의 일부가 아니어야합니다. 아마 다른 곳에 그것을 고려해야할까요?

+0

왜 downvotes에 대한 약간의 피드백을 얻는 것이 좋을 것입니다. – occulus

+0

이것이 왜 투표 결과가 내려 졌는지는 모르겠지만 고맙습니다. 다른 곳에서는 그것을 고려하려고합니다. – evanskis

관련 문제