본문 바로가기

Computer

iPhone - Delegate 만들기 - 1

Objective C 는 Delegate Pattern 이 많은 부분을 차지합니다.

특히 아이폰 개발에서는 이벤트 방식의 특성상 Delegate로 시작해서 Delegate 로 끝난다고 해도 과언이 아닐 정도로 많이 사용하고 있습니다.

UITableView 에서만 봐도

- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;


이 둘은 테이블을 나타내기 위해 필수적으로 구현해야 하는 Delegate 이며, 이외에도


- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath;


등의 Delegate를 구현함으로써 편집 기능등을 사용할 수 있습니다.


이 뿐 아니라, 터치 이벤트, HTTP 호출, 글쓰기 등 많은 부분에서 사용되는 패턴이 바로 Delegate 패턴입니다. 


이번 회에서는 Delegate 에 대한 간략한 설명을 하고

다음 회에 직접 Delegate를 만드는 코드를 선보이도록 하겠습니다.



우선 Delegate는 @interface 가 아닌 @protocol 입니다.


Apple Developer Documentation 에서는 Protocols 에 대하여 아래와 같이 설명하고 있습니다.


Protocols declare methods that can be implemented by any class. Protocols are useful in at least three situations:

  • To declare methods that others are expected to implement

  • To declare the interface to an object while concealing its class

  • To capture similarities among classes that are not hierarchically related


어렵게 써놓은 듯 한데.. 결국은 상속관계가 아닌 어느 클래스에서나 사용될 수 있는 선언된 메소드 라는 뜻으로 보이네요.


Delegate 에는 두가지 메소드 형식이 있습니다.


하나는 @required 로 선언된 영역이며, 다른 하나는 @optional 로 선언된 영역입니다.


@required 는 해당 Delegate 를 사용한다면 반드시 구현을 해야 하는 필수 메소드입니다.


UITableDataSource 의 메소드들을 예로 들어보겠습니다.


- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;



첫번째 메소드 tableView:numberOfRowsInSection: 은 테이블안의 셀 갯수를 리턴해 주는 역할을 하며,

두번째 메소드 tableView:cellForRowAtIndexPath: 는 테이블안의 내용 (TableViewCell) 를 리턴해 주는 역할을 합니다.


@optional 은 선택해서 사용할 수 있는 메소드로

UITextFieldDelegate 의

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;

등을 예로 들 수 있습니다.


위 메소드는 글자가 입력되는 이벤트를 받았을때, 해당 textField 객체, range, 입력되거나 바뀌는 replacementString 을 파라미터로 받고 안의 처리를 통해서 입력을 해도 되는지를 BOOL 값으로 리턴합니다.

Text Filed 의 글자 수를 제한하거나 특정 문자를 제한하려 할 때 사용할 수 있는 Delegate 입니다.



다음 회에서는 이러한 Delegate 를 직접 만들어 보는 코드를 소개하도록 하겠습니다.

'Computer' 카테고리의 다른 글

iPhone user Agent  (0) 2010.05.25
iPhone - Delegate 만들기 - 2  (0) 2010.05.25
iPhone NSUserDefaults 사용하기  (0) 2010.05.25
iPhone Property list - info.plist 에 추가하는 Property  (0) 2010.05.24
[Ubuntu] SVN Client 설정  (2) 2008.08.04