Button是我們最常見(jiàn)的控件了下面看下常規(guī)用法
- (void)viewDidLoad {
[super viewDidLoad];
[self createView];
// Do any additional setup after loading the view.
}
- (void)createView{
UIButton * mybutton = [UIButton buttonWithType:UIButtonTypeCustom];
mybutton.frame=CGRectMake(50,300,40,20);
[mybutton setTitle:@"test" forState:UIControlStateNormal];
[mybutton setBackgroundColor:[UIColor orangeColor]];
[mybutton addTarget:self action:@selector(dealButtonAction:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:mybutton];
}
//button點(diǎn)擊事件
-(void)dealButtonAction:(UIButton*)bu{
NSLog(@"處理點(diǎn)擊事件");
}
每一個(gè)Button 都要對(duì)應(yīng)一個(gè)對(duì)應(yīng)的方法,如果有十個(gè)八個(gè)button的話那么創(chuàng)建十個(gè)八個(gè)方法的話,那的多亂,多么的難找
細(xì)想一下.如果Button 能這樣
[mybutton addEventHandler:^{
NSLog(@"處理點(diǎn)擊事件");
} forControlEvents:UIControlEventTouchUpInside];
是不是很神奇
那怎么才能辦到呢
- button 添加了方法要用到分類
- button 新方法進(jìn)行了事件綁定用到了RunTimes
話不多說(shuō) 上代碼
#import <UIKit/UIKit.h>
#import <objc/runtime.h>
/** 事件回調(diào)的block */
typedef void (^UIButtonBlock) (void);
NS_ASSUME_NONNULL_BEGIN
@interface UIButton (block)
@property (nonatomic,copy)UIButtonBlock touchAction;
- (void)addEventHandler:(void (^)(void))block forControlEvents:(UIControlEvents)controlEvents;
@end
//------- 漂亮的分割線 -------//
#import "UIButton+block.h"
@implementation UIButton (block)
//------- 添加屬性 -------//
static void *touchActionKey = &touchActionKey;
- (UIButtonBlock)touchAction{
return objc_getAssociatedObject(self, &touchActionKey);
}
- (void)setTouchAction:(UIButtonBlock)touchAction{
objc_setAssociatedObject(self, &touchActionKey, touchAction, OBJC_ASSOCIATION_COPY);
}
/**
給按鈕綁定事件回調(diào)block
@param block 回調(diào)的block
@param controlEvents 回調(diào)block的事件
*/
- (void)addEventHandler:(void (^)(void))block forControlEvents:(UIControlEvents)controlEvents {
self.touchAction = block;
[self addTarget:self action:@selector(blcokButtonClicked) forControlEvents:controlEvents];
}
// 按鈕點(diǎn)擊
- (void)blcokButtonClicked {
if (self.touchAction) {
self.touchAction();
}
}
button擴(kuò)展了一個(gè)帶block回調(diào)的方法,然后綁定了對(duì)應(yīng)的事件,就是有點(diǎn)復(fù)雜.
是不是很神奇 , 如果你感覺(jué)這樣很好玩,那么下面的一個(gè)叫RAC的東西,更方便更高效
pod導(dǎo)入
pod 'ReactiveObjC', '~> 3.0.0'
頭文件
#import <ReactiveObjC.h>
開(kāi)始用
[[mybutton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"處理點(diǎn)擊事件");
}];
是不是很簡(jiǎn)潔,那么下面請(qǐng)看
RAC初探