UITableViewDelegateなどのデリゲートを自作クラスに実装する方法です.デリゲートを自作できると好きなタイミングで処理やデータの受け渡しが簡単にできるので,覚えておくべき手法の一つです.
(例)カウントダウンする自作クラス MyTimer にて,以下の自作デリゲードを実装してカウントダウン中に他クラスから自身を制御できるようにする.
(b) カウントダウンが終わったときによばれる ( didMyTimerFinished: )
自作クラスのヘッダーにて,protocolを用いてデリゲート名 MyTimerDelegate および,必要なメソッドを宣言して,interfaceにて自デリゲートを持つidを追加する.
デリゲートの各メソッドを書いていく
このサンプルコードです.ライセンスは使った分・得した分だけ,知り合いに飯を奢ること.
Read more
(例)カウントダウンする自作クラス MyTimer にて,以下の自作デリゲードを実装してカウントダウン中に他クラスから自身を制御できるようにする.
(b) カウントダウンが終わったときによばれる ( didMyTimerFinished: )
自作クラスのヘッダーにて,protocolを用いてデリゲート名 MyTimerDelegate および,必要なメソッドを宣言して,interfaceにて自デリゲートを持つidを追加する.
[MyTimer.h]つぎに,メソッドファイルにて,そのデリゲートを好きなタイミングで呼び出す.
#import < foundation / foundation.h >
@class MyTimer;
@protocol MyTimerDelegate
@optional // オプション
-(void)didMyTimerCounted:(MyTimer *)myTimer;
@required // 必須
-(void)didMyTimerFinished:(MyTimer *)myTimer;
@end
@interface MyTimer : NSObject
@property NSInteger counter;
@property id < MyTimerDelegate > delegate;-(void)countDown:(NSInteger)time;
@end
[MyTimer.m]自作デリゲートの実装のこれで終わり.ほかのデリゲートと同様に使えばOK.
#import "MyTimer.h"
@implementation MyTimer
-(void)countDown:(NSInteger)time
{
self.counter = time;
do{
self.counter--;
[self.delegate didMyTimerCounted:self];
}while ( self.counter > 0 );
[self.delegate didMyTimerFinished:self];
}
@end
[MEViewController.h]
#import < UIKit / UIKit.h >
#import "MyTimer.h"
@interface MEViewController : UIViewController < MyTimerDelegate >
{
MyTimer *myTimer_;
}
@end
デリゲートの各メソッドを書いていく
[MEViewController.m]
#import "MEViewController.h"
@implementation MEViewController
- (void)viewDidLoad
{
[super viewDidLoad];
myTimer_ = [[MyTimer alloc] init];
myTimer_.delegate = self;
[myTimer_ countDown:20];
}
-(void)dealloc
{
myTimer_.delegate = nil;
}
-(void)didMyTimerCounted:(MyTimer *)myTimer
{
NSLog(@"%s", __func__);
NSLog(@"counter = %d", myTimer.counter);
}
-(void)didMyTimerFinished:(MyTimer *)myTimer
{
NSLog(@"%s", __func__);
NSLog(@"counter = %d", myTimer.counter);
}
@end
このサンプルコードです.ライセンスは使った分・得した分だけ,知り合いに飯を奢ること.