UIControlのイベントハンドラをBlocksにする方法
UIControlのカテゴリを作成し、UIbutton等のイベントハンドラをBlocksで受け取り
内部的にaddTargetすることで実現する。
ポイントはobjc_getAssociatedObjectを使って引数で受け取ったblocksをcopyして
自身に保持するところ。
categoryではインスタンス変数を保持出来ない問題を回避している。
------------------------------------------------------------------------------------------------------------
UIControl+UIControl_BlockCallBack.h
------------------------------------------------------------------------------------------------------------
#import <UIKit/UIKit.h>
@interface UIControl (UIControl_BlockCallBack)
- (void)addHandlerWithEvent:(UIControlEvents)event Block:(void (^)())block;
- (void)callBack:(id)sender;
@end
------------------------------------------------------------------------------------------------------------
UIControl+UIControl_BlockCallBack.h
------------------------------------------------------------------------------------------------------------
#import "UIControl+UIControl_BlockCallBack.h"
#import <objc/runtime.h>
@implementation UIControl (UIControl_BlockCallBack)
static const NSString *key = @"key";
-(void)addHandlerWithEvent:(UIControlEvents)event Block:(void (^)())block
{
objc_setAssociatedObject(self, key, block, OBJC_ASSOCIATION_COPY);
[self addTarget:self action:@selector(callBack:) forControlEvents:event];
}
- (void)callBack:(id)sender
{
void (^block)() = objc_getAssociatedObject(self, key);
if(block){
block();
}
}
@end
------------------------------------------------------------------------------------------------------------
使用例:
------------------------------------------------------------------------------------------------------------
#import "UIControl+UIControl_BlockCallBack.h"
・
・
・
UIButton *testButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
testButton.frame = CGRectMake(self.view.center.x-50.0, 20.0, 100.0, 50.0);
[testButton setTitle:@"test" forState:UIControlStateNormal];
[testButton addHandlerWithEvent:UIControlEventTouchUpInside Block:^{
NSLog(@"Simple CallBack");
}];
[self.view addSubview:testButton];
------------------------------------------------------------------------------------------------------------