美文网首页
iOS按钮实现block方式相应

iOS按钮实现block方式相应

作者: 进击的iOS开发 | 来源:发表于2017-11-30 09:56 被阅读0次

现在公司用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];
}];

相关文章

网友评论

      本文标题:iOS按钮实现block方式相应

      本文链接:https://www.haomeiwen.com/subject/qqgpbxtx.html