본문 바로가기

Computer

iPhone - Delegate 만들기 - 2


이전편에 이어서 이번회에는 Delegate 를 만드는 코드를 소개하도록 하겠습니다..

예를 들 코드는 아래와 같이 한 줄 입력을 하는 댓글창입니다.


<댓글을 입력하기 전>



<댓글을 입력하였을 때>


위의 부분에서 등록 버튼을 눌렀을 때 입력한 텍스트가 등록을 해도 괜찮은 것인지를 검사하기 위해서

등록버튼을 눌렀을때 발생하는 이벤트를 받는 Delegate 를 구현하고자 합니다.

(※ 아래의 코드는 완성된 코드가 아니며, 설명에 필요한 부분만을 보여주는 것입니다.)

CommentTextView.h

@protocol CommentTextViewDelegate;


@interface CommentTextView : UIView <UITextViewDelegate>{

id<CommentTextViewDelegate> _delegate;

UITextView *cTextView;

UIView *placeHolderView;

UIButton *submitButton;

}


@property (nonatomic, assign) IBOutlet id<CommentTextViewDelegate> delegate;

@property (nonatomic, retain) UITextView *cTextView;

@property (nonatomic, retain) UIView *placeHolderView;

@property (nonatomic, retain) UIButton *submitButton;


- (id) init;

- (id) initWithCoder:(NSCoder *)aDecoder;

- (id) initWithFrame:(CGRect)frame;

- (NSString*) submitComment;

@end



@protocol CommentTextViewDelegate <NSObject>


@optional

- (BOOL)shouldSubmitCommentTextButton:(NSString *)commentText;

@end


CommentTextView 에는 하나의 Interface 와 하나의 Protocol 이 선언되어 있습니다.

Interface 의 _delegate 는 CommentTextviewDelegate 프로토콜형의 id 로 선언되어 있으며, XIB 와 연결을 위하여 IBOutlet 으로 선언되어 있습니다.

Protocol  에는 submitCommentTextButton: 메소드를 가지고 있으며, optional 로 선언되어 있어 필요 Delegate 가 아니라 선택을 할 수 있도록 만들어놓았습니다.


CommentTextView.m


#import "CommentTextView.h"



@implementation CommentTextView


@synthesize delegate = _delegate;


- (NSString*) submitComment{

BOOL reVal = YES;

NSString *str = [cTextView text];

if ([_delegate respondsToSelector:@selector(shouldSubmitCommentTextButton:)]) {

reVal = [_delegate shouldSubmitCommentTextButton:str];

}

if (reVal) {

[cTextView resignFirstResponder];

[cTextView setText:@""];

if (target) {

[target performSelector:selector withObject:str];

}

}

return str;

}



submitComment 는 submitButton을 눌렀을때 발생하는 Action 입니다.

submitComment 가 호출되면 cTextView 로 부터 입력된 텍스트를 받고 _delegate 에서 shouldSubmitCommentTextButton:이 구현되어 있는지를 검사합니다. 
respondsToSelector: 는 Selector 의 응답이 있는지를 검사하는 메소드로 BOOL 을 리턴합니다.

구현이 되어 있다면 delegate 를 통해서 텍스트를 입력 받을 수 있게끔 파라미터로 전달하고 BOOL 형의 리턴값을 전달 받습니다.
리턴값이 YES라면 미리 지정했던 target 의 selector 에 텍스트를 보내어 다음 행동을 하고, NO라면 selector 의 동작을 하지 않습니다.


이제 CommentTextView 를 사용하는 Class 에서는 CommentTextViewDelegate 를 사용하여 등록버튼을 누른경우 다음 동작을 할 것인지를 결정할 수 있게 됩니다.



CommentController.m

- (BOOL)submitCommentTextButton:(NSString *)commentText{

if(...){

       return YES;

}else {

       return NO;

}

}