ViewとViewControllerを繋いで処理をイベントハンドラ登録する

Viewのパブリックプロパティを使う

切り離したViewのうち、ViewControllerでアクセスするサブビューをパブリックプロパティにする方法。
画面パーツはViewに配置し、ViewControllerからアクセスする必要があるパーツはパブリックプロパティにしておくこと。
また、ViewControllerでViewを生成した後、パブリックプロパティ経由でイベントハンドラ登録を行うようにする。
TestView.h
@interface TestView : [[UIView]]
// パブリックプロパティ
@property(nonatomic, strong) UIButton *onButton;
@end

TestViewController.m
@interface TEstViewController ()
@property(nonatomic, strong) TestView *testView;
@end

@implementation TestViewController

-(void) loadView {
    // View生成
    self.testView = [[TestView alloc] init];
    self.view = self.testView;

    // 繋ぎ部分
    // ViewControllerからイベントハンドラ登録
    [self.testView.onButton addTarget:self action:@selector(onTapped) forControlEvents: UIControlEventTouchUpInside];
    
}

// イベントハンドラ
-(void) onTapped {
    ...
}

@end

デリゲートを定義する方法

より変更に強い設計にするにはView専用のデリゲートを定義し、ViewとViewControllerをデリゲート経由で繋ぐ方法がオススメ。

ポイント

  • View専用のデリゲートViewDelegateを定義する
  • ViewではViewDelegateのみパブリックプロパティにする
  • ViewDelegateのセッタ内でイベントハンドラ登録等を行う
  • ViewControllerはViewDelegateを実装する
  • ViewControllerでViewを生成した後、ViewのViewDelegateを設定する

TestView.h
// 専用デリゲート
@protocol TestViewDelegate
-(void) onTapped;
@end

@interface TestView : UIView
// デリゲートのみパブリックにする
@property(nonatomic, weak) id<TestViewDelegate> delegate;
@end

TestView.m
@interface TestView
// サブビューはプライベートにする
@property(nonatomic, strong) UIButton *onButton;
@end

@implementation TestView

// デリゲートのセッタ
-(void) setDelegate:(id<TestViewDelegate>)delegate {
    _delegate = delegate;

    // デリゲート経由でイベントハンドラ登録
   [self.onButton addTarget:delegate action:@selector(onTapped) forControlEvents: UIControlEventTouchUpInside];
}

@end

TestViewController.m
// デリゲートを実装
@interface TestViewController () <TestViewDelegate>
@property(nonatomic, strong) TestView *testView;
@end

@implementation TestViewController

-(void) loadView {
    // View生成
    self.testView = [[TestView alloc] init];
    self.view = self.testView;

    // 繋ぎ部分
    self.testView.delegate = self;
}

// イベントハンドラ
-(void) onTapped {
    ...
}

@end
最終更新:2014年07月15日 00:59