- 給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(@"-------");
}];