<사전>
Delegate : 위임하다, 대표자
델리게이트는 아이폰 개발을 위해 공부하다 보면, 처음 닥치는 위기? 같은것입니다.
델리게이트 구현처에서는, Objective C 의 interface(Class)에 사용자 정의 콜벡함수(CallBack Function)
만 가지는(Virtual Function) Class 하나를 만들고, 그 멤버변수를 해당 상황에 호출하게 됩니다.
즉, 델리게이트 사용처에서는, 델리게이트 구현부의 멤버포인터(class <MyDelegateVirtualClass> delegate;)의
포인터를 내 클래스를 가르키게 하고, 추상클래스의 멤버함수를 구현하면, 상황에 맞게 호출되게 됩니다.
내공이 얕아서, 말보다 코드가 쉽겠네요..
임의의 클래스에 다음과 같이 코드를 변경합니다. - 진한 부분이 기본 정의에서 추가된 부분입니다.
#import <UIKit/UIKit.h>
// 정의를 선언
@protocol MyTestDelegate;
@interface MyTestController : UIViewController {
id<MyTestDelegate> delegate;
}
@property (nonatomic,assign) id<MyTestDelegate> delegate;
@end
@protocol MyTestDelegate<NSObject>;
@required
-(void) MyTestDelegateMsg:(NSString *)text;
@end
위를 보시면, interface 내부에서 델리게이트를 사용하기 위해 정의를 먼저 선언하고, 아래에서 protocol 을 구현합니다.
MyTestDelegateMsg 라는 함수를 정의하고, 이것은 델리게이트 사용하는 곳에서 반드시 구현이 요구됩니다.
델리게이트 메시지를 알려주고자 하는 부분에 아래처럼 사용합니다.
델리게이트 메시지를 알려주고자 하는 부분에 아래처럼 사용합니다.
[self.delegate MyTestDelegateMsg:@"델리게이트 메세지 받았나요?"];
인터페이스가 MyTestDelegate를 상속받으므로, 이곳에서 구현할 MyTestDelegateMsg 포인터는 호출한곳의
포인터와 겹치게 됩니다. 즉 불려지게 됩니다.
#import <UIKit/UIKit.h>
#import "MyTestController.h"
@interface MyMainController : UIViewController<MyTestDelegate> {
}
@end
먼저 델리게이트 포인트를 나와 연동해 둡니다.
myTestController.delegate = self;
호출부만 코딩하죠
-(void)MyTestDelegateMsg:(NSString *)text{
NSLog(text);
}
...
만일 이해를 다 하였다면, 우리가 사용할 많은 컨트롤 들의 이벤트를 받기 위해서, 단지 처리를 위한 지정자를
나로 설정하고, 처리 함수만 구현해 주면 된다는것을 알게 됩니다. - 짧은 글로 그런생각을 하기에는 환상일지도..
이상 델리게이트였습니다.
'Tool&Util > Xcode' 카테고리의 다른 글
Xcode에서 자동으로 생성되는 template 수정하기 (0) | 2011.05.17 |
---|---|
XCode 블럭(괄호) 스타일 바꾸기 (0) | 2011.05.16 |
Application Loader에서 애플 개발자 계정 설정 변경 (0) | 2011.05.12 |
iPhone용 웹 개발 팁 (1) | 2011.05.04 |
XCode - xib 파일의 리소스와 이벤트를 인터페이스빌더(Interface Builder) 없이 연결하기 (0) | 2011.03.24 |