ひとりまとめ

もろもろのメモ

Storyboardで貼付けておいたもので、Delegateを使いたい!

Storyboardで画面に配置した画像から、delegateの仕組みを使ってどうにか通知を送ることができるようになったので、備忘録。

やりたいこと

Storyboardに1画面上にある画像をタップされたら、ViewContorollerに通知をする。ただし、画像はあらかじめStoryboardで貼付けておきたい。
 

処理の流れ

画面が読み込まれる
 ↓
画像が配置される
 ↓
画像のdelegateを画面が受け取るよ!と名乗り上げる
 ↓
画像がタップされる
 ↓
タップされたイベントが発生
 ↓
タップされたイベントが、画面で待ち受けているdelegateのメソッドを呼び出す
 ↓
画面のdelegateのメソッドが実行される 
 

準備

・ViewContoroller用にfirstViewContorollerというクラスを作る。
・Storyboardをつかって、この画面にObjectLibraryからImageViewを配置。タップのイベントが取れるように、
 Attributesインスペクタ → View → Interactionにある
 User Interaction Enabledにチェックを入れる
 ※Identityインスペクタにもあるけど別モノなので注意。
・ImageView用にTouchImageViewというクラスを作る。
 

delegateしてもらう側を作る

今回で言うと、TouchImageView。
■.hの記述
delegateの内容を規定する
  delegateの名前
  受け取る側が用意すべきメソッド

 @interfaceのまえに、次のように書く。

//delegateの名前
@protocol TouchImageDelegate <NSObject>

//受け取り側に用意するメソッド名。引数をつかって値も渡せる。 
-(Void) delegateCatch;

@end

・やり取り用のdelegateインスタンスを用意する

//protocolで用意した名前に合わせる
@property id<TouchImageDelegate> delegate;

 
■.mの記述
・@propertyに対応するsynthesize

@synthesize delegate = _delegate;

delegateで受け渡すための、イベント用メソッド
今回は画像をタップしたら ということにしたので、touchesBeganにしかけてみた。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
 //delageteするクラスに記述したメソッドを叩く
 //メソッドは、protocolで定義したもの
    [_delegate delegateCatch]; 
}

delegateする側を書く

■.hの記述
あらかじめStoryboardをつかってImageViewを貼付けておくので、アウトレットを接続(?)する。Storyboardを開いて、該当Imageviewからcotrol+ドラッグで.hまでもっていく。名前はtestImageとかにしてみた。

//画像に独自クラス(TouchImageView)を割り当ててるので、そういう名前になってる
@property (strong, nonatomic) IBOutlet TouchImageView *testImage;

・画像の独自クラスを読み込む

#import "TouchImageView"

・@interfaceで、delegateを引き受けることを言う

@interface ViewController : UIViewController<TouchImageDelegate>

・画像から叩かれるメソッドを用意する

- (void)delegateCatch;

■.mの記述
・画像に対して、delegeteを引き受けることを伝える。
 viewDidLoadに記述

- (void)viewDidLoad
{
    [super viewDidLoad];

 //以下の1文を追加
    testImage.delegate = self;   
}

・画像から叩かれるメソッドを実装する

-(void)delegateCatch
{
    NSLog(@"Catch!");
}

悩んだところ

プログラムで自分でインスタンスと作って配置する場合はなんとなくわかったのだけど、呼び出し元を事前に貼付けていた場合にどうすればいいのか。当たり前のことなんだけど、「あれ?どうすんの??」となってしまいました。

「アウトレットを作っておく」「viewDidLoadでdelegateを指定する」というのだけ気をつければ、方法は同じですね。