UITextField添加block回调代替代理

主要用到的原理是分类和runtime的关联对象方法。

代码

声明:

typedef void(^YC_StringBack)(NSString *string);

@interface UITextField (Block)

@property(nonatomic,copy)YC_StringBack changeBack;

@end


实现:

#import "UITextField+Block.h"

#import 

static NSString*changeBackKey =@"changeBackKey";

@interface UITextField ()

@end

@implementation UITextField (Block)

-(instancetype)init{

    if(self= [super init]) {

        [self initSubView];

    }


    return self;

}

-(instancetype)initWithFrame:(CGRect)frame

{

    if(self= [super initWithFrame:frame]) {

        [self initSubView];

    }

    return self;

}

- (void)textFieldDidEndEditing:(UITextField *)textField{


    if(self.changeBack) {

        self.changeBack(textField.text);

    }


}

-(void)setChangeBack:(YC_StringBack)changeBack{

    objc_setAssociatedObject(self, &changeBackKey, changeBack, OBJC_ASSOCIATION_COPY);


}

-(YC_StringBack)changeBack{


    return objc_getAssociatedObject(self, &changeBackKey);

}

- (void)initSubView{


    self.delegate=self;


}

@end



runtime中关联对象相关的方法有三个

objc_setAssociatedObject//添加关联对象

objc_getAssociatedObject//获取关联对象

objc_removeAssociatedObjects//删除关联对象


voidobjc_setAssociatedObject(idobject,constvoid*key,idvalue,objc_AssociationPolicy policy)

第一个参数:id object : 表示关联的源对象,为textfile做的关联对象,就是该对象

第二个参数:const void *key : 获取被关联者的索引key

第三个参数:id value : 被关联者

第四个参数:objc_AssociationPolicy policy : 关联策略,一般使用OBJC_ASSOCIATION_RETAIN_NONATOMIC


idobjc_getAssociatedObject(id object,constvoid*key)

第一个参数:id object : 表示关联的源对象,为textfile做的关联对象,就是该对象

第二个参数:const void *key : 获取被关联者的索引key


voidobjc_removeAssociatedObjects(id object)

只有一个参数id object,是关联的源对象。作用就是移除object的所有关联。

你可能感兴趣的:(UITextField添加block回调代替代理)