본문 바로가기
Tool&Util/Xcode

XCode - Protocol (델리게이트)

by 백룡화검 2011. 3. 24.


<사전>
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);

}



...

만일 이해를 다 하였다면, 우리가 사용할 많은 컨트롤 들의 이벤트를 받기 위해서, 단지 처리를 위한 지정자를

나로 설정하고, 처리 함수만 구현해 주면 된다는것을 알게 됩니다. - 짧은 글로 그런생각을 하기에는 환상일지도..

이상 델리게이트였습니다.