iOS手机号输入框相关需求及实现

一.运用场景

咱们在开发中都会有 手机号注册、登陆或者地址详情有收货人手机号输入及判断的问题

二.要求

通常产品会有以下要求
  1. 数字键盘
  2. 数据校验,输入时或者输入后必须为全数字
  3. 键盘上有完成按钮,相似下图

4.须要全选制手机联系人(iOS11有坑)bash

三.解决方案

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;  
  }
}
复制代码
4.复制手机联系人.通常的用户都会采用从联系人复制而后粘贴到输入框。

用户得本身删除之间的空格,在iOS11后,系统在复制时加入了些乱码类的东西,即便用户删除能看到的空格,仍是有问题。ide

字符串长度13.本地手机号校验确定过不了,服务端校验也不会过。解决方案为:将字符串中的数字所有提出来重组ui

[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; 
   }
}复制代码

或者本地不改,告诉服务端的同窗,让他们将字符串中的数字所有提出来重组,思想同理 
相关文章
相关标签/搜索