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