RSS
1

iOS: delegateを自作クラスに実装する

UITableViewDelegateなどのデリゲートを自作クラスに実装する方法です.デリゲートを自作できると好きなタイミングで処理やデータの受け渡しが簡単にできるので,覚えておくべき手法の一つです.

(例)カウントダウンする自作クラス MyTimer にて,以下の自作デリゲードを実装してカウントダウン中に他クラスから自身を制御できるようにする.

    (a) カウントダウン中に逐次呼ばれる ( didMyTimerCounted: )
    (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]

      #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
      自作デリゲートの実装のこれで終わり.ほかのデリゲートと同様に使えばOK.
      [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

      このサンプルコードです.ライセンスは使った分・得した分だけ,知り合いに飯を奢ること.

      Read more