现在公司用RAC(ReactiveCocoa)框架开发,里面的按钮响应方法感觉很方便
就像下面这种风格的写法
[[self.signInButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(idx) {
NSLog(@"button clicked");
}];
RAC是函数式响应式的编程思想,但是不用这个框架就没有这个灵活的方法了。所以自己写了一个分类实现了类似的功能,写的比较简单,大家多多赐教。
// UIButton+YYEAddClickBlock.h
#import <UIKit/UIKit.h>
typedef void(^clickBlock)(UIButton *sender);
@interface UIButton (YYEAddClickBlock)
- (void)addClickForControlEvents:(UIControlEvents)event click:(clickBlock)block;
@end
// UIButton+YYEAddClickBlock.m
#import "UIButton+YYEAddClickBlock.h"
#import <objc/runtime.h>
static void *strKey = &strKey;
@interface UIButton ()
@property (copy ,nonatomic) clickBlock yyeInBlock;
@end
@implementation UIButton (YYEAddClickBlock)
- (void)addClickForControlEvents:(UIControlEvents)event click:(clickBlock)block {
self.yyeInBlock = block;
[self addTarget:self action:@selector(yyeMyClick:) forControlEvents:event];
}
- (void)yyeMyClick:(UIButton *)sender {
sender.enabled = NO;
if (self.yyeInBlock) {
self.yyeInBlock(sender);
}
sender.enabled = YES;
}
-(void)setYyeInBlock:(clickBlock)bloack {
objc_setAssociatedObject(self, &strKey, bloack, OBJC_ASSOCIATION_COPY);
}
-(NSString *)yyeInBlock {
return objc_getAssociatedObject(self, &strKey);
}
@end
下面是用法
__weak typeof(self) weakSelf = self;
[self.btn addClickForControlEvents:UIControlEventTouchUpInside click:^(UIButton *sender) {
//do something
UIViewController *newVC = [weakSelf.storyboard instantiateViewControllerWithIdentifier:@"testVC"];
[weakSelf.navigationController pushViewController:newVC animated:YES];
}];
网友评论