2012-04-25 2 views
0

이 dateSelectViewController라는 방법은 프로토콜로 내 .H 파일에 선언 한 I : 저는 대리자를 프로토콜 아래왜이 대리인입니까? 프로토콜이 응답하지 않습니다.

@class DateSelectViewController; 
@protocol DateSelectViewControllerDelegate 

- (void)dateSelectViewController:(DateSelectViewController *)sender 
         theDate:(id)stringDate; 

@end 

선언하고 있습니다 :

@property (nonatomic, weak) id <DateSelectViewControllerDelegate> delegate; 

및 구현 파일에

, I 대리자를 합성하고 완료 버튼을 내보기에 누를 때 나는 대리인에게 메시지를 보내

- (IBAction)DonePressed:(id)sender { 
    NSDate *chosen = [datePicker date]; 
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 

    [formatter setDateFormat:@"MM/dd/yyyy"]; 
    NSString *formatedDate = [formatter stringFromDate:chosen]; 

    //sending a message to the delegate 
    [self.delegate dateSelectViewController:self theDate:formatedDate]; 

    [self.navigationController popViewControllerAnimated:YES]; 
} 

.H 되 고 파일 드에서 legated, delegators .h 파일을 가져오고 있습니다. .m 파일에서 나는 프로토콜을 따르고 있습니다.

@interface MakePlantTVC()<DateSelectViewControllerDelegate> 
- (void)dateSelectViewController:(DateSelectViewController *)sender 
        theDate:(id)stringDate 
{ 
    self.displayDate.text = stringDate; 
    NSLog(@"delegate working"); 
} 

어떤 이유인지 이것도 전혀 작동하지 않습니다. 위임자 클래스에서 완료 버튼을 누르면 버튼이 정상적으로 수행되고 뷰 컨트롤러가 팝업되지만 메시지는 절대 위임자에게 전송되지 않습니다. 처음에는 메시지를 보낼 수있을 것이라고 생각했지만 유형 ID는 없으므로 그렇지 않아야합니다. 메시지가 전송되지 않는 이유는 무엇입니까?

+0

위임자에게 메시지를 보내기 전에'NSLog (@ "delegate = % @", self.delegate)'를 추가하십시오. – zrxq

+1

위임자를 설정 했습니까? – Roshit

+0

위임자에게 메시지를 전달하는 동안이 조건을 사용하여 대리인의 가용성을 확인하는 것이 좋음'if (self.delegate && [self.delegate respondsToSelector : @selector (method_name)]) {[self.delegate method_name ]}' – Roshit

답변

6

몇 가지 대리자를 설정 한

  • 마음에 왔어요? 그것은 어리석게 들릴지도 모르지만 대리인이 작동하지 않는 경우 IB 연결을 잊거나 90 %의 시간을 잃어 버리기 때문에 문제가 발생합니다.
  • 약한 객체가 만료 되었습니까? 그러므로 당신은 '아무것도'에 위임 작업을 수행하고 - - 약한 개체는 nil'ed 아마도 당신이 유용 할 수 있습니다 내가 대표 연습 뭔가 더 retainy 또는 NSNotification

다른 일을 할

  • 어설 트 기반 프로그래밍을 사용 하시겠습니까? 당신이 필요한 기능과 프로토콜을 때, 즉, 주장하는 가치 :

    dispatch_async(dispatch_get_main_queue(), ^{ 
        if ([delegate_ respondsToSelector:@selector(updateUI:)]) 
        [delegate_ updateUI:self]; 
    }); 
    
: 대리자는
  • 파견 대리인이 GCD와 비동기 적으로 호출하는 선택, 즉 응답하는 경우 NSAssert(delegate, @"Error, delegate not set!");

  • 확인보고

    희망이 도움이됩니다!

  • +0

    안녕하세요. 왜 GCP와 비동기 적으로 대리인 호출을 파견하는 것이 중요합니까? 내 코드에는 다음과 같은 것이있다 : [self.delegate numberPadView : self digitPressed : [[[보낸 사람 titleLabel] 텍스트] intValue]];'필수 대리자 메서드 btw. 나는 그것에 대해 궁금했고, 적절한 사용자 정의 위임 메소드를 구현하는 것을 잊었을 때 내 사용자 정의 위임 메소드 용 NSAssert 메시지를 구현하는 방법에 대해 궁금했습니다. 내 자신의 필수 대리자 메서드를 구현하는 것을 잊었을 때 멋진 메시지가 튀어 나오길 원합니다. – Pavan

    +0

    델리게이트 함수가 UI를 업데이트 할 가능성이 있습니다. UI 업데이트는 주 스레드에서 수행해야합니다. UI 콜백은 주 스레드에서 발생하도록 보장되지만 KVO, NSNotification 및 NSUrlConnection 콜백은 발생하지 않습니다. 델리게이트 대상은 호출자의 스레드 정치를 신경 쓰지 않아야합니다. IMHO 주 스레드를 전환하고 대리자 메서드가 필요한 경우 자체 메서드를 구현하도록하는 것이 좋습니다. 대리자 메서드가 주 스레드에서 발생한다고 가정하면 각 대리자의 공용 메서드에서 test-switch-reinvoke를 구현하지 않아도됩니다. –

    +0

    RE 멋진 팝업 :'doesNotRecognizeSelector' 구현 –

    관련 문제