主要用到的原理是分类和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的所有关联。