zoukankan      html  css  js  c++  java
  • iOS-button利用block封装按钮事件【runtime 关联】

    用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
  • 相关阅读:
    oracle添加字段,备注
    oracle对日期date类型操作的函数
    查询效率例子收藏
    webuploader.min.js 简单例子
    select 数字/字符串/count(参数)/sum(数字) from table
    oracle常用分析函数 over(partition by xxx order by xxx)
    LigerUi遮罩的两个方法
    LigerUI子父窗口之间传参问题
    LigerUi自动检索输入
    LigerUi折叠与展开
  • 原文地址:https://www.cnblogs.com/wangkejia/p/9100172.html
Copyright © 2011-2022 走看看