しょぼしょぼプログラマ雑記

自分のための備忘録。 開発記録など掲載してます。 質問・ご意見・ご感想等はTwitter ( https://twitter.com/yun_hokuto ) までお気軽にどうぞ。

delegateの実装方法(改訂)

delegateはしばしは「代理人」と訳されますが、よくわからない人も居るはず。
自分もdelegateで躓いた一人です。
というわけでdelegateについての記述をば。

delegateとは「本来やるべき処理を別のメソッドで代わりにやってもらう」事。
だから「代理人」なんですね。

例として「parentというcontrollerでchildというcontrollerをインスタンス化し、childのボタンが押されたときに、parentのメソッドを実行する」という内容で行きます。

[parentViewController.h]

#import "childViewController.h"  // インスタンス化するchildを読み込む
@interface parentViewController : UIViewController < childViewControllerDelegate>
{
}
- (void) viewInitialScreen;  // childのボタンが押されたときに実行するメソッド

[parentViewController.m]

- (void)viewDidLoad
{
    [superviewDidLoad];
    // childViewControllerをインスタンス化
    childViewController *cvc = [self.storyboard instantiateViewControllerWithIdentifier:@"childViewController"];
    // インスタンスの大きさを設定
    cvc.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    // controllerを追加
    [self addChildViewController: cvc];
    // Viewを追加
    [self.view addSubview: cvc.view];
    // インスタンスのdelegate先を自分に設定
    cvc.delegate = self;
}
 
// 呼び出すメソッド
- (void) outputLog
{
    NSLog(@"delegate is success.");
}

[childViewController.h]

@protocol childViewControllerDelegate;
@interface childViewController : UIViewController
{
    id <childViewControllerDelegate> delegate;
}
@property (nonatomic) id <childViewControllerDelegate> delegate;
@end
 
@protocol childViewControllerDelegate
    - (void) outputLog;
@end

[childViewController.m]

@implementation childViewController
@synthesize delegate;
 
// ボタンタップ時メソッド
- (IBAction)touchUpButton:(id)sender
{
    [delegate outputLog];  // 呼び出すparentのメソッドを記述
}

ポイントは「インスタンスdelegate先を自分」と設定することです。
自分が調べたときには、delegate先を設定するところが全然記載されておらず、実装しても動かないというのがほとんどでしたので・・・。

参考資料
Objective-C delegateの実装