欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS-button利用block封装按钮事件【runtime 关联】

程序员文章站 2022-03-22 14:43:04
用block封装最常用的就是网络请求的回调,其实也可以结合category封装button的按钮事件,同时利用runtime的对象关联; UIButton+wkjButton.h 文件 UIButton+wkjButton.m 文件 ......

用block封装最常用的就是网络请求的回调,其实也可以结合category封装button的按钮事件,同时利用runtime的对象关联;

UIButton+wkjButton.h 文件

#import <UIKit/UIKit.h>

typedef void(^btnClickAction)(UIButton *button);

@interface UIButton (wkjButton)
//@property(nonatomic,copy)btnClickAction blockAction;

/**
 新建button >>
 bgColor:默认白色
 fontColor:默认黑色
 */
+ (UIButton *)wkj_buttonFrame:(CGRect)frame
                       title:(NSString *)title
                     bgColor:(UIColor *)bgColor
                   fontColor:(UIColor *)fontColor
                    fontSize:(CGFloat)fontSize
                    fontBold:(BOOL)bold
                      action:(btnClickAction)actionBlock;
@end

UIButton+wkjButton.m 文件

#import "UIButton+wkjButton.h"

//关联对象的key
static NSString *keyOfButtonMethod;

//读取属性 block的key【暂时无用】
//static NSString *keyOfActionBlock;

@implementation UIButton (wkjButton)

/**
 新建button >>
 bgColor:默认白色
 fontColor:默认黑色
 */
+ (UIButton *)wkj_buttonFrame:(CGRect)frame
                       title:(NSString *)title
                     bgColor:(UIColor *)bgColor
                   fontColor:(UIColor *)fontColor
                    fontSize:(CGFloat)fontSize
                    fontBold:(BOOL)bold
                      action:(btnClickAction)actionBlock{
    
    
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    

    button.frame = frame;
    [button setTitle:title forState:UIControlStateNormal];
    if (bgColor) {
        button.backgroundColor = bgColor;
    }
    else{
        button.backgroundColor = [UIColor whiteColor];
    }
    
    if (fontColor) {
        [button setTitleColor:fontColor forState:UIControlStateNormal];
    }
    else{
        [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    }
    
    if (bold) {
        button.titleLabel.font = [UIFont wkj_boldFontSize:fontSize];
    }
    else{
        button.titleLabel.font = [UIFont systemFontOfSize:fontSize];
    }
    
    [button addTarget:button action:@selector(wkj_buttonClick:) forControlEvents:UIControlEventTouchUpInside];
    
    ///runtime 方法关联
    objc_setAssociatedObject(button, &keyOfButtonMethod, actionBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);
    return button;
}
- (void)wkj_buttonClick:(UIButton *)button{
    ///如果用self.blockAction 要添加get set 方法,这里是直接取到关联的block
    
    ///通过key【keyOfMethod】获取关联对象
    btnClickAction block = (btnClickAction)objc_getAssociatedObject(button, &keyOfButtonMethod);
    if (block) {
        block(button);
    }
}

///如果要实现属性读取,添加 get set 方法
//- (btnClickAction)blockAction{
//    return objc_getAssociatedObject(self, &keyOfActionBlock);
//}
//- (void)setBlockAction:(btnClickAction)blockAction{
//    objc_setAssociatedObject(self, &keyOfActionBlock, blockAction, OBJC_ASSOCIATION_COPY_NONATOMIC);
//}
}


@end