8

iPhone에서 이벤트를 처리하는 방법에 대한 개념을 이해하는 데 문제가 있습니다. 도움! 대의원들이 나를 혼란스럽게합니다. 설명 할 사람이 있겠 니?객관적인 C 용어 : 콘센트 및 대리자

+2

저크가 되려고하지 않고 developer.apple.com에서 소개 문서를 읽으셨습니까? 그 질문은 대답하기위한 에세이를 택할 것입니다. 어쩌면 당신을 매달아 놓고 있는지에 대해보다 자세한 질문을 할 수 있습니다. –

+0

Apple이 Cocoa Fundamentals Guide에서 제공하는 설명서 : http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/CommunicateWithObjects.html#//apple_ref/doc/uid/ TP40002974-CH7-SW3 및 대표자 : http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/CommunicateWithObjects.html#//apple_ref/doc/uid/TP40002974-CH7-SW18이 표시됩니다. 꽤 철저하게 나에게. –

+0

@ 브래드 - 나는 문서 작성자가 아닙니다. – Moshe

답변

19

아웃렛 (Interface Builder에서)은 런타임에 디자이너가로드 될 때 객체가 할당되는 클래스의 멤버 변수입니다. IBOutlet 매크로 (비어있는 #define)는 인터페이스 작성기가 이것을 디자이너에 표시 할 콘센트로 인식하도록 신호를 보냅니다.

나는 버튼을 드래그하면 예를 들어, 런타임에 NIB 파일의 로딩이 인스턴스화하는 UIButtonaButton 포인터를 할당합니다 (.H 파일 내 인터페이스에 정의)이 aButton 콘센트에 연결 부리. 그리고 구현에

@interface MyViewController : UIViewController { 
    UIButton *aButton; 
} 

@property(nonatomic, retain) IBOutlet UIButton *aButton; 

@end 

는 :

@implementation MyViewController 

@synthesize aButton; // Generate -aButton and -setAButton: messages 

-(void)viewDidAppear { 
    [aButton setText:@"Do Not Push. No, seriously!"]; 
} 

@end 

이 인스턴스화 런타임에 GUI 오브젝트를 할당하는 코드를 작성할 필요가 없습니다. 대리인로서는


들은 (예 테이블 뷰로서 일반적으로 일반화 된 API 클래스) 다른 목적으로 사용되는 경우 수신 개체이다. 본질적으로 특별한 것은 없습니다. 그것은 더 많은 디자인 패턴입니다. Delegate 클래스는 다음과 같은 예상되는 여러 메시지를 정의 할 수 있습니다 :

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

... 그리고는 이벤트를 통지하고자 할 때 API 객체는 대리자에이 메시지를 호출합니다. 예를 들어 :

-(void)update:(double)time { 
    if (completed) { 
     [delegate process:self didComplete:totalTimeTaken]; 
    } 
} 

그리고 대표는 메시지를 정의

-(void)process:(Process *)process didComplete:(double)totalTimeTaken { 
    NSString *log = [NSString stringWithFormat:@"Process completed in %2.2f seconds.", totalTimeTaken]; 
    NSLog(log); 
} 

사용은 할 수 있습니다

Process *proc = [Process new]; 
[proc setDelegate:taskLogger]; 
[proc performTask:someTask]; 

// Output: 
// "Process completed in 21.23 seconds." 
+0

그래서 델리게이트는 실제로 Javascript 나 Python과 같은 다른 언어가 콜백으로 해석하는 영광스러운 버전입니까? – SexyBeast

9

대리자가 다른 객체가 메시지를 전달 할 수있는 개체입니다. 다른 말로하면, 엄마가 방을 청소하라고 말했고, 동생이 그 방을 청소했을 때와 같습니다. 당신의 어린 동생은 (당신이 배우기에는 너무 게을 렸기 때문에) 일을하는 법을 알고 있습니다. 그래서 그는 당신을 위해서 그것을합니다.

+1

훌륭한, 교훈적인 비교! –

+1

왜 엄마가 동생에게 직접 물어 보지 않았습니까? – super9