본문 바로가기

프로그래밍/iOS

[ios] Delegate사용 법

1. 선언

@class ViewController; //뷰 컨트럴러 선언 전에 선언하는 경우가 많아 클래스 명만 미리 쳐둠

 

@protocol ViewControllerDelegate <NSObject>

 

@optional

- (void) function : (ViewController*)viewController ;

@end

 

함수 작성시에는 현재 뷰컨트럴러를 넘겨준다.

이 이유는 델리게이트를 쓰는 함수가 해당 뷰컨트롤러의 동작 시점은 알 수 있지만, 해당 뷰컨트럴러를 조작할 수 없기 때문에 넣는것이 관례이다. 

TableView나 SearchBar의 delegate함수들을 보면 

 

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

위와 같이 tableView에 접근할 수 있는 인자를 가지고 있다.

 

원하는 인자를 추가하기 위해서는 :을 통해 추가해주면 된다.

만약 위 함수에서 int값을 하나 넘겨주고 싶다면

-(void) function : (ViewController*) viewContrl withInt : (int) num;

위와 같이 선언하면 된다.

 

2. 뷰컨트롤러 안에 변수 추가

@interface ViewController : UIViewController

 

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

 

@end

 

3. 원하는 시점에 delegate 함수 만들어주기

if (_delegate && [_delegate respondsToSelector:@selector(function:)]) //delegate와 function이란 delegate함수가 존재한다면

    {

        [_delegate function:self]; //delegate함수 호출

    }

    else

    {

        NSLog(@"delegate function: 함수가 구현되지 않았습니다.");

 

    }

 

4. 뷰 컨트롤러를 띄우는 이전 뷰컨트럴러 에서 Delegate 선언

@interface나 @impelement 클래스명 오른쪽에 <ViewControllerDelegate> 추가

ex) @interface MainViewController : UIViewController <ViewControllerDelegate>

 

5. 뷰컨트럴러 선언시 delegate설정

ViewController* viewContrl = [[ViewController alloc] init];

viewContl.delegate = self; //이부분, 4번을 하지 않으면 해도 소용없음

 

 6. delegate함수 구현

- (void) function : (ViewController*) viewContrl;

{

   //원하는 작업을 넣는다.

}

 

위의 작업을 모두 해야하지만 숫자로만 적으면 헷갈리니 설명을 보충

MainViewController.m에서 ViewController.m을 띄운다고 가정하면

1,2번은 ViewController.h에서 해야 할 내용이고

3번은 ViewController.m에서 해야 할 내용이다.

4번은 MainViewController.h에서 해야 할 내용이고

5,6번은 MainViewController.m에서 해야 할 내용이다.