iOS手机号输入框相关问题解决
1.运用场景
手机号注册登录、地址中收货人手机号
2.要求
数字键盘、数据校验、键盘上有完成按钮、复制手机联系人
3.解决方案
1>数字键盘
self.middleTextField.keyboardType = UIKeyboardTypeNumberPad;
2>数据校验
- (BOOL)checkTelNumber:(NSString *)num {
if (num.length <= 0) {
return NO;
}
NSString *regexStr = @"^((1[0-9]))\\d{9}$";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regexStr];
BOOL isMatch = [pred evaluateWithObject:num];
return isMatch;
}
3>键盘上有完成按钮。自定义UITextField。
- (void)drawRect:(CGRect)rect {
[super drawRect:rect];
UIToolbar * toobar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 38.0f)];
toobar.translucent = YES;
toobar.barStyle = UIBarStyleDefault;
UIBarButtonItem * spaceBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem * doneBarButtonItem = [[UIBarButtonItem alloc] init];
UIButton * saveBtn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 60, 38)];;
[saveBtn setTitle:@"完成" forState:UIControlStateNormal];
[saveBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[saveBtn addTarget:self action:@selector(resignKeyboard) forControlEvents:UIControlEventTouchUpInside];
doneBarButtonItem.customView = saveBtn;
[toobar setItems:@[spaceBarButtonItem,doneBarButtonItem]];
if (self.keyboardType == UIKeyboardTypeNumberPad) {
self.inputAccessoryView = toobar;
}else{
self.inputAccessoryView = nil;
}
}
- (void)resignKeyboard
{
if ([self isFirstResponder]) {
[self resignFirstResponder];
}
}
4>复制手机联系人.一般的用户都会采用从联系人复制然后粘贴到输入框。用户得自己删除之间的空格,在iOS11后,系统在复制时加入了些乱码类的东西,即使用户删除能看到的空格,还是有问题。字符串长度13.本地手机号校验肯定过不了,服务端校验也不会过。解决方案为:将字符串中的数字全部提出来重组
[self.middleTextField addTarget:self action:@selector(middleTextFieldTextChange:) forControlEvents:UIControlEventEditingChanged];
- (void)middleTextFieldTextChange:(UITextField *)textField{
NSString *pureNumbers = [[textField.text componentsSeparatedByCharactersInSet:[[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet]] componentsJoinedByString:@""];
if (pureNumbers && [pureNumbers length] >= 11) {
textField.text = pureNumbers;
}
}
或者本地不改,告诉服务端的同学,让他们将字符串中的数字全部提出来重组,思想同理