Objective-C 自前でデリゲートを作る
自前で作ったクラスでデリゲートさせる
既存のクラスにデリゲートを呼んでもらったことあるけど、
自分でも呼んでみたーい。
やってみよう
5回メソッドが呼ばれるとコールバックしてあげるよ
doMethodが5回よばれたら、callThisMethodメソッド呼ぶから準備してね。ってーソースを作ることにした。
FiveTimeDo.h
#import <Foundation/Foundation.h> @protocol FiveTimeDoDelegate <NSObject> -(void) callThisMethod; @end @interface FiveTimeDo : NSObject { id <FiveTimeDoDelegate> delegate; NSInteger *i; } @property (retain, nonatomic) id <FiveTimeDoDelegate> delegate; -(void) setMyDelegate:(id <FiveTimeDoDelegate>)d; -(void) doMethod; @end
FiveTimeDo.m
#import "FiveTimeDo.h" @implementation FiveTimeDo @synthesize delegate; - (void)setMyDelegate:(id <FiveTimeDoDelegate>)d { delegate = d; } -(void)doMethod { i = i + 1; if( (int) i % 5 == 0 ){ [self.delegate callThisMethod]; } } @end
ViewController.h
#import <UIKit/UIKit.h> #import "FiveTimeDo.h" @interface ViewController : UIViewController <FiveTimeDoDelegate> @property (retain, nonatomic) NSString *s; @end
ViewController.m
#import "ViewController.h" @implementation ViewController @synthesize s; ... 省略 - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; s = @"呼ばれた"; FiveTimeDo *f = [[FiveTimeDo alloc] init]; [f setMyDelegate:self]; [f doMethod]; [f doMethod]; [f doMethod]; [f doMethod]; [f doMethod]; [f doMethod]; [f doMethod]; [f doMethod]; [f doMethod]; [f doMethod]; [f doMethod]; } #pragma mark - delegate - (void) callThisMethod { NSLog(@"%@", s); }
結果
2012-03-15 18:33:32.628 RENSYU[3524:f803] 呼ばれた 2012-03-15 18:33:32.674 RENSYU[3524:f803] 呼ばれた