如果你使用了ReactiveCocoa请跳过本文,平常为TextField写监听可能需要这样写
[textField addTarget:self action:@selector(textDidChanged:) forControlEvents:UIControlEventEditingChanged];
- (void)textDidChanged:(UITextField *)sender{
do something...
}
那有没有用委托或者block代替呢,如果你是用了ReactiveCocoa,想必是极好的,但ReactiveCocoa不易驾驭,下面提供一个分类简化代码
.h文件
#import <UIKit/UIKit.h>
typedef void(^TextDidChangedBlock)();
@interface UITextField (Extension)
@property (nonatomic, copy) TextDidChangedBlock textChangedBlock;
@end
.m文件
#import "UITextField+Extension.h"
#import <objc/runtime.h>
@implementation UITextField (Extension)
-(void)setTextChangedBlock:(TextDidChangedBlock)textChangedBlock{
[self addTarget:self action:@selector(textDidChanged) forControlEvents:UIControlEventEditingChanged];
objc_setAssociatedObject(self, @selector(textChangedBlock), textChangedBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
-(TextDidChangedBlock)textChangedBlock{
return objc_getAssociatedObject(self, _cmd);
}
- (void)textDidChanged{
if (self.textChangedBlock) {
self.textChangedBlock();
}
}
@end
然后再写监听就简单了多了
//这里要注意循环引用
textField.textChangedBlock = ^{
do someting...
};
这样写是不是简单多了,当然,如果某个控制器TextField很多,可能就不是很优雅了。这个时候,使用委托的方式会好一点,具体可以参照上面的代码。