UIButton拡張Blockクリックイベント

1899 ワード

主にruntimeによってプロパティを動的に関連付けます.上码!!!
#import 

typedef void(^ButtonBlock)(UIButton* btn);

@interface UIButton (Block)

/**
 *  button  
 *
 *  @param block
 */
- (void)addAction:(ButtonBlock)block;

/**
 *  button  
 *
 *  @param block
 *  @param controlEvents  
 */
- (void)addAction:(ButtonBlock)block forControlEvents:(UIControlEvents)controlEvents;

@end

////////////////////////////////////////////////////


#import "UIButton+Block.h"

#import 

@implementation UIButton (Block)
static char ActionTag;

/**
 *  button    UIControlEventTouchUpInside
 *
 *  @param block
 */
- (void)addAction:(ButtonBlock)block {
    objc_setAssociatedObject(self, &ActionTag, block, OBJC_ASSOCIATION_COPY_NONATOMIC);
    [self addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside];
}

/**
 *  button  
 *
 *  @param block
 *  @param controlEvents  
 */
- (void)addAction:(ButtonBlock)block forControlEvents:(UIControlEvents)controlEvents {
    objc_setAssociatedObject(self, &ActionTag, block, OBJC_ASSOCIATION_COPY_NONATOMIC);
    [self addTarget:self action:@selector(action:) forControlEvents:controlEvents];
}

/**
 *  button  
 *
 *  @param sender 
 */
- (void)action:(id)sender {
    ButtonBlock blockAction = (ButtonBlock)objc_getAssociatedObject(self, &ActionTag);
    if (blockAction) {
        blockAction(self);
    }
}
@end


使用方法は以下の通りです.
    UIButton *testButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    testButton.backgroundColor = [UIColor redColor];
    [self.view addSubview:testButton];
    
    [testButton addAction:^(UIButton *btn) {
        NSLog(@" ");
    }];
    
    [testButton addAction:^(UIButton *btn) {
         NSLog(@" ");
    } forControlEvents:UIControlEventTouchUpInside];
    


O了,喜欢的走心哦...