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]; ------------------------------------------------------------------------------------------------------------