2012-01-03 1 views
1

prepareForSegue 메서드에서 호출 한 소스보기 컨트롤러의 플래그 (NSNumber 속성)를 설정하려고하는 모달보기 컨트롤러가 있습니다. "선택자 'setGoToEditNewNote :'"에 대해 알려진 인스턴스 메소드가 없습니다. "오류로 인해 빌드에 실패합니다.prepareForSegue에서 대상보기 컨트롤러의 NSNumber 속성을 설정하는 중 오류가 발생했습니다.

원본 뷰 컨트롤러 .H :

@property (strong, nonatomic) NSNumber *goToEditNewNote; 

원본 뷰 컨트롤러하는 .m :

@synthesize goToEditNewNote; 
... 

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
    // clear the flag 
    goToEditNewNote = [[NSNumber alloc] initWithBool:FALSE]; 
... 

- (void)viewWillAppear:(BOOL)animated 
{ 
[super viewWillAppear:animated]; 
    if ([goToEditNewNote boolValue] == TRUE) { 
     goToEditNewNote = FALSE; 
     [self performSegueWithIdentifier: @"editNote" sender: self]; 
... 

모달보기 컨트롤러 .H :

모달보기 컨트롤러하는 .m 여기에 코드입니다 :

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"done"]) 
    { 
     [self done]; 
     [[segue destinationViewController] setGoToEditNewNote:TRUE]; <<< get error here 
    } 
} 

모달 뷰가로드 될 때 goToEditNewNote가 유지되지 않는 문제가있을 수 있다고 생각하지만 이유를 이해하지 못합니다. managedObjectContext와 같은 다른 속성을 성공과 비슷한 방식으로 설정했습니다. ARC의 초심자 인 귀하의 답변에 가능한 구체적으로 기재하십시오. 고마워요 - Tom

답변

1

destinationViewControllergoToEditNewNote 속성을 포함하지 않는 id 유형입니다. destinationViewControllerSourceViewController 유형으로 변환하려고합니다. 이것은 일반적으로 경고이지만 모든 경고를 오류로 취급하는 것처럼 들립니다 (나도 마찬가지입니다).

-prepareForSegue:sender:은 다음과 유사해야합니다.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"done"]) 
    { 
     [self done]; 
     SourceViewController *sourceViewController = (SourceViewController *)[segue destinationViewController]; 
     [sourceViewController setGoToEditNewNote:[NSNumber numberWithBool:YES]]; 
    } 
} 
+1

또한 BOOL Value를 NSNumber 속성으로 설정하면 Runtime 오류가 아니라 컴파일러 경고가 표시되어야합니다. 그러나이 경우는 Mark –

+0

에 설명 된 것과 동일합니다. 맞습니다. BOOL을 NSNumber에 전달하면 세그멘테이션 오류가 발생합니다. 내 코드를 업데이트했습니다. OP, 처음에는 'BOOL'을 사용하지 않는 이유가 무엇입니까? –

+0

@M 및 @D. 내가 제안한대로했는데 오류가 사라졌지만, 세트가 소스 뷰 컨트롤러로 돌아 가지 않았습니다. segue에서 설정 한 값을 기록하고 예상대로 goToEditNewNote = 1을보고했습니다. 그런 다음 소스 뷰 컨트롤러의 viewWillAppear 메서드에 값을 기록했습니다. 그것은 goToEditNewNote = 0을보고했습니다. Mark, 원래는 BOOL을 사용했지만 문제에 대해 더 많은 것을 이해하거나 해결하기 위해 NSNumber로 변경했습니다. 이 링크가 관련성이 있습니까? http://www.ifans.com/forums/showthread.php?t=183427. 세터를 추가해도 문제가 해결되지 않았습니다. –

0

처음에는 ARC를 사용하는 경우 절대 retain (또는 release)을 사용해야합니다. Object 만 인스턴스화하면되지만 삭제할 필요는 없습니다. 객체가 서로 원으로 참조되는지 조심하십시오. A가 B를 참조하면 B는 C, C 참조를 참조하고 변수 D (A를 가리킴)를 통해 이러한 변수에 액세스하고 D를 더 이상 사용하지 않으면 A-B-C의 원이 메모리에 유지됩니다. 그런 다음 A-B-C 참조 중 하나를 '약한'것으로 정의해야합니다.

하지만 실제 질문 : 구현 파일에서 @synthesize 문을 놓쳤을 가능성이 있습니까?

+0

내 질문에 이미 내 코드에있는 synthesize 문을 포함하도록 업데이트 했으므로 다른 문제가 있습니다. 순환 참조 문제가 보이지 않습니다. 하나를 볼 수 있다면 구체적으로 지적하십시오. –

+0

순환 참조 문제가 없습니다. 기회를 이용하여 "3 문장 - 가이드"를 제공하고 싶습니다. –

0

"setGoToEditNewNote:" 선택기에 해당하는 인스턴스 메서드가 없다는 오류가 발생했습니다. 귀하의 속성을 합성 (또는 접근자를 직접 작성) 했습니까?

+0

이미 내 코드에있는 synthesize 문을 포함하도록 내 질문을 업데이트 했으므로 다른 문제가 있습니다. –

1

나는 동일한 문제가있었습니다. 2 일이 걸렸고 웹에서 정답을 찾을 수 없었습니다. 이상하게도 Stanford CS193p의 동일한 코드가 작동합니다. 운 좋게 나는 그것을 지금 해결했다! "속성 메서드 설정"을 찾을 수 없습니다. 오류의 원인은 #import "xxxx.h"입니다. 여기서 xxxx는 Segue의 대상보기 컨트롤러 이름입니다. 가져 오지 않으면 xxxx의 속성을 알 수 없습니다!

쉽고, 이제 segue가 작동합니다.

+0

이 문제를 게시한지 얼마되지 않았습니다. 그러나 나는 당신이 옳다고 생각합니다. 그때 이후로 나는 당신의 제안에 매달렸다. 게시 해 주셔서 감사합니다. –

+0

우리 모두가 서로를 돕는다면 당신을 환영합니다. 내가 처음으로 이곳에 온 것을 매우 기쁘게 생각합니다. – WHT