美文网首页
UITextField添加block回调代替代理

UITextField添加block回调代替代理

作者: 飞行的理想 | 来源:发表于2022-02-21 17:52 被阅读0次

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

代码

声明:

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

@interface UITextField (Block)

@property(nonatomic,copy)YC_StringBack changeBack;

@end

实现:

#import "UITextField+Block.h"

#import <objc/runtime.h>

static NSString*changeBackKey =@"changeBackKey";

@interface UITextField ()<UITextFieldDelegate>

@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回调代替代理

      本文链接:https://www.haomeiwen.com/subject/vtuilrtx.html