- 一般app至少都有10几个输入框,多的几十个,这时候我们在一个个写的时候有时候就会觉得很麻烦,为什么呢,因为很多都需要做限制,比如只能输入数字,输入的长度不能超过11(电话号码),长度不能超过6(验证码),长度不能超过20(密码),长度不能超过50(数据库字符限制)等等。你一个个的写很烦很头疼很多垃圾代码怎么办呢?
- 我忍无可忍自己写了一个稍微方便点的,需求就是尽量我在调用的时候用一句话就可以达到我的需求。
- 我最开始写了个category直接声明textField发现不行答不到我的需求,不能直接写监听和代理还得到子类去实现。于是我用了一个view来装textField。直接上代码吧:
typedef enum KZWTextFieldType {
KZWTextFieldPhone,
KZWTextFieldCode,
KZWTextFieldPWD,
KZWTextFieldDefault
} KZWTextFieldType;
@interface KZWBaseTextField : UIView
- (instancetype)initWithFrame:(CGRect)frame font:(CGFloat)font keyboardType:(UIKeyboardType)keyboardType placeholder:(NSString *)placeholder KZWTextFieldType:(KZWTextFieldType)type;
@property (strong, nonatomic) UITextField *textField;
@property (copy, nonatomic) NSString *text;
- (void)setText:(NSString *) text;
@end
这是.h的代码,一个枚举对一些特殊类型的处理,分别是手机,验证码,密码和默认。声明的方法里参数分别是frame,font,keyboardType,placeholder,KZWTextFieldType,属性是textField的text和setText。
#import "KZWBaseTextField.h"
@interface KZWBaseTextField()
@property (assign, nonatomic) KZWTextFieldType type;
@property (strong, nonatomic) UIToolbar *toolbar;
@end
@implementation KZWBaseTextField
- (instancetype)initWithFrame:(CGRect)frame font:(CGFloat)font keyboardType:(UIKeyboardType)keyboardType placeholder:(NSString *)placeholder KZWTextFieldType:(KZWTextFieldType)type{
if (self = [super initWithFrame:frame]) {
[self addSubview:self.textField];
self.textField.frame = CGRectMake(0, 0, frame.size.width, frame.size.height);
self.textField.font = [UIFont systemFontOfSize:font];
self.textField.keyboardType = keyboardType;
self.textField.placeholder = placeholder;
self.type = type;
}
return self;
}
- (UITextField *)textField {
if (!_textField) {
_textField = [[UITextField alloc] init];
_textField.clearButtonMode = UITextFieldViewModeWhileEditing;
_textField.borderStyle = UITextBorderStyleNone;
_textField.backgroundColor = [UIColor whiteColor];
_textField.returnKeyType = UIReturnKeyDone;
_textField.textColor = [UIColor colorWithHexString:FontColor333333];
_textField.inputAccessoryView = self.toolbar;
_textField.delegate = self;
[_textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; }
return _textField;
}
- (UIToolbar *)toolbar
{
if (!_toolbar) {
CGRect tempFrame = CGRectMake(0, 0, SCREEN_WIDTH, 40);
_toolbar = [[UIToolbar alloc] initWithFrame:tempFrame];
UIBarButtonItem *bgItem = [[UIBarButtonItem alloc] initWithCustomView:({
UIView *bgview = [[UIView alloc] initWithFrame:CGRectMake(8, 0, 200, 40)];
UIImageView *image = [[UIImageView alloc] initWithFrame:CGRectMake(0, 10, 20, 20)];
image.image = [UIImage imageNamed:@"bg_tfaq"];
[bgview addSubview:image];
UILabel *label = [UILabel initWithFrame:CGRectMake(25, 0, 150, 40) textColor:[UIColor colorWithHexString:FontColor999999] font:FontSize24];
label.text = @"空中金融安全键盘";
[bgview addSubview:label];
bgview;
})];
UIBarButtonItem *spaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *endItem = [[UIBarButtonItem alloc] initWithCustomView:({
UIButton *end = [UIButton initWithType:KZWButtonTypeDefault normalTitle:@"完成" titleFont:FontSize28 cornerRadius:0];
[end addTarget:self action:@selector(end:) forControlEvents:UIControlEventTouchUpInside];
end.backgroundColor = [UIColor clearColor];
end.frame = CGRectMake(0, 0, 40, 40);
end;
})];
_toolbar.items = @[bgItem, spaceItem, endItem];
}
return _toolbar;
}
- (void)end:(id)sender {
[self.textField resignFirstResponder];
}
- (void)textFieldDidChange:(UITextField *)textField {
NSString *toBeString = textField.text;
toBeString = [self filterCharactor:textField.text withRegex:@"[^a-zA-Z0-9\u4e00-\u9fa5]"];
NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage];
if([lang isEqualToString:@"zh-Hans"]) {
UITextRange *selectedRange = [textField markedTextRange];
UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
if(!position) {
textField.text = [self lengthLimit:toBeString];
}
else{
}
}
else{
textField.text = [self lengthLimit:toBeString];
}
}
- (NSString *)lengthLimit:(NSString *)toBeString {
switch (self.type) {
case KZWTextFieldIdCard:
{
if(toBeString.length > 18) {
return [toBeString substringToIndex:18];
}
}
break;
case KZWTextFieldPhone: {
if(toBeString.length > 11) {
return [toBeString substringToIndex:11];
}
}
break;
case KZWTextFieldPWD: {
if(toBeString.length > 16) {
return [toBeString substringToIndex:16];
}
}
break;
case KZWTextFieldCode: {
if(toBeString.length > 6) {
return [toBeString substringToIndex:6];
}
}
break;
case KZWTextFieldDefault: {
if(toBeString.length > 50) {
return [toBeString substringToIndex:50];
}
}
break;
case KZWTextFieldMoney: {
if(toBeString.length > 8) {
return [toBeString substringToIndex:8];
}
}
break;
default:
break;
}
return toBeString;
}
- (NSString *)text {
return self.textField.text;
}
- (void)setText:(NSString *)text {
self.textField.text = text;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return YES;
}
- (NSString *)filterCharactor:(NSString *)string withRegex:(NSString *)regexStr{
NSString *filterText = string;
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regexStr options:NSRegularExpressionCaseInsensitive error:&error];
NSString *result = [regex stringByReplacingMatchesInString:filterText options:NSMatchingReportCompletion range:NSMakeRange(0, filterText.length) withTemplate:@""];
return result;
}
@end
.m的代码初始化,textField的声明,textFieldDidChange长度处理、过滤掉非字母/数字/汉子,代理点done落下键盘。这样基本已经完美的达到我自己的需求了。什么边缘测试,特殊字符测试都统统没问题。
- 最后看下调用
self.nameTextField = [[KZWBaseTextField alloc] initWithFrame:CGRectMake(113, 30, SCREEN_WIDTH - 113, 52) font:FontSize30 keyboardType:UIKeyboardTypeDefault placeholder:@"请填写真实姓名" KZWTextFieldType:KZWTextFieldDefault];
[footView addSubview:self.nameTextField];
self.ocrModel.name = self.nameTextField.text;
完!