UITextField可以通过代理回调数据,也可以通过Block回调数据。
//UIText.h
#import <UIKit/UIKit.h>
typedef void(^textShowDidFinished)(NSString * content);//类型重定义的block
@interface UIText : UIView<UITextFieldDelegate>//代理
@property (nonatomic,copy)textShowDidFinished block;
@property (nonatomic,strong)UITextField * textcon;
@end
// UIText.m
#import "UIText.h"
@implementation UIText
-(instancetype)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self != nil) {
self.textcon = [[UITextField alloc]initWithFrame:CGRectMake(40, 60, frame.size.width-80, 60)];
self.textcon.borderStyle = UITextBorderStyleRoundedRect;
[self addSubview:self.textcon];
[self.textcon becomeFirstResponder];
self.textcon.delegate = self;//一定要写,不然UITextField不会接收到数据
}
return self;
}
//通过这个方法实时监听UITextField上的内容的变化
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
NSString * str = [textField.text stringByReplacingCharactersInRange:range withString:string];
NSLog(@"%@",str);
self.block(str);
return YES;
}
@end
首先我们写了一个类,这个类继承于UITextField,然后我们重定义了一个block(一般操作),之后我们定义了重定义类型的block的一个属性变量,又定义了一个UITextField的一个属性变量。在实现文件中,我们重写了init方法,实现了协议中的textField: 方法,在实现的这个协议中的方法中,我们调用了block,并传递了一个参数,通过这个参数来实现数据的回调。
#import "ViewController.h"
#import "UIText.h"
@interface ViewController ()
@property (nonatomic,strong)UIText * text;
@property (nonatomic,strong)UILabel * label;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.text = [[UIText alloc]initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width,self.view.bounds.size.height)];
self.label = [[UILabel alloc]initWithFrame:CGRectMake(40, 180, self.view.bounds.size.width-80, 60)];
self.label.backgroundColor = [UIColor orangeColor];
[self.view addSubview:self.text];
[self.view addSubview:self.label];
__weak typeof(self) weakSelf = self;
self.text.block = ^(NSString * content){
weakSelf.label.text = content;
};
}
@end
我们在主界面控制器的视图中添加了一个UILable和一个UITextField(UIText是自定义的继承于UITextField的子类),然后实现了在UITextfield中的block方法:将UITextField中的内容同步显示到UILbel上。