利用runtime實現(xiàn)對象關(guān)聯(lián)

  • 給UIBarButtonItem添加一個Block分類
#import <UIKit/UIKit.h>

@interface UIBarButtonItem (BlockSupport)

- (nullable instancetype)initWithTitle:(nullable NSString *)title style:(UIBarButtonItemStyle)style andBlock:(void(^)())clickBlock;

@end
#import "UIBarButtonItem+BlockSupport.h"
#import <objc/runtime.h>

const char *barbuttonItemBlockKey = "barbuttonItemBlockKey";

@implementation UIBarButtonItem (BlockSupport)

- (instancetype)initWithTitle:(nullable NSString *)title style:(UIBarButtonItemStyle)style andBlock:(void(^)())clickBlock
{
    self = [self initWithTitle:title style:style target:self action:@selector(handleClick)];
    if (self) {
        objc_setAssociatedObject(self, barbuttonItemBlockKey, clickBlock, OBJC_ASSOCIATION_COPY);
    }
    return self;
}

- (void)handleClick
{
    void (^block)() = objc_getAssociatedObject(self, barbuttonItemBlockKey);
    if (block ) {
        block();
    }
}

@end

.m實現(xiàn)是將外界傳進來的clickBlock跟self進行關(guān)聯(lián)

 objc_setAssociatedObject(self, barbuttonItemBlockKey, clickBlock, 

當點擊Item對象的時候,執(zhí)行handClick方法,在handClick方法通過self拿到外界傳遞進來的Block,并執(zhí)行

 void (^block)() = objc_getAssociatedObject(self, barbuttonItemBlockKey);
    if (block ) {
        block();
}

下面使用我們經(jīng)常處理按鈕點擊的常用方法來使用objc_setAssociatedObject實現(xiàn)

1.創(chuàng)建一個UIButton的分類

#import <UIKit/UIKit.h>

@interface UIButton (Block)

- (void)addBlock:(void(^)())clickBlock;
@end

#import "UIButton+Block.h"
#import <objc/runtime.h>

const char *buttonBlockKey = "buttonBlockKey";

@implementation UIButton (Block)

- (void)addBlock:(void(^)())clickBlock
{
    [self addTarget:self action:@selector(handleClick) forControlEvents:UIControlEventTouchUpInside];
    objc_setAssociatedObject(self, buttonBlockKey, clickBlock, OBJC_ASSOCIATION_COPY);
    
    
}

- (void)handleClick
{
    void (^block)() = objc_getAssociatedObject(self, buttonBlockKey);
    if (block ) {
        block();
    }
}
@end

那么我們在代碼中監(jiān)聽按鈕的點擊事件

[btn addBlock:^{
// 當按鈕被點擊執(zhí)行的代碼
        NSLog(@"-------");
    }];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容