iOS10 自動填充手機號實現UITextContentTypeTelephoneNumber

在iOS 10 中,UITextField新增了textContentType字段,是UITextContentType類型,它是一個枚舉,作用是可以指定輸入框的類型,以便系統可以分析出用戶的語義.

今天我們就主要研究下:UITextContentTypeTelephoneNumber 手機號碼

效果如圖所示

手機號提示效果圖

1. 首先,實現的第一步,我們需要監聽指定輸入框(UITextFieldDelegate無法完全實現此功能)
  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldEditChanged:) name:UITextFieldTextDidChangeNotification object:self.txtPhoneNumber];
2.設置輸入框 textContentType = UITextContentTypeTelephoneNumber,keyboardType = UIKeyboardTypeNumbersAndPunctuation,并做好iOS10以下版本的兼容
    if (@available(iOS 10.0, *)) {
        self.txtPhoneNumber.textContentType = UITextContentTypeTelephoneNumber;
        self.txtPhoneNumber.keyboardType = UIKeyboardTypeNumbersAndPunctuation;
    }else
    {
        self.txtPhoneNumber.keyboardType = UIKeyboardTypeNumberPad;
    }
3.處理輸入結果
#pragma mark - UITextFieldTextDidChangeNotification
-(void)textFieldEditChanged:(NSNotification *)obj
{
    UITextField *textField = (UITextField *)obj.object;
    NSString *toBeString = textField.text;
    //兼容鍵盤QuickType Bar以+86開頭的號碼
    toBeString = [toBeString stringByReplacingOccurrencesOfString:@"+" withString:@""];
   //兼容英文鍵盤前后空格
    toBeString = [toBeString stringByReplacingOccurrencesOfString:@" " withString:@""];
    
    if (toBeString.length>0) {
        if (![self isNumber:toBeString]) { 
            //兼容輸入非數字時的處理 ,切去最后一位
            toBeString = [toBeString substringToIndex:toBeString.length-1];
        }
    }
    textField.text = toBeString;

    //此處為處理鍵盤提示號碼邏輯(如:8618000000000)及(如:+861800000000)
    if (@available(iOS 10.0, *)) {
        //兼容號碼數字鍵盤
        if (toBeString.length==13) {
            NSString * startString = [toBeString substringToIndex:3];
            if ([startString isEqualToString:@"861"]) {
                //當字符串長度為13位,并以861開頭時,截取86,余下則為11位手機號
                textField.text = [toBeString substringFromIndex:2];
            }
        }
    }
}
4.結合(UITextFieldDelegate)處理輸入表情特殊字符邏輯
#pragma mark - UITextFieldDelegate
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
   
    if([string isEqualToString:@"\n"]) {
        [textField resignFirstResponder];
        return NO;
    }
    if (textField == self.txtPhoneNumber) { 
        if ([self isContainsEmoji:string]) {
            //禁輸表情符號
            return NO;
        }
    }
    return YES;
}
總結:

此方式可實現獲取鍵盤QuickType Bar所提示手機號碼、屏蔽特殊字符、禁輸Emoji表情,完美實現手機號的輸入和快速鍵盤獲取的功能,歡迎大家指正探討

問題點:

只支持中國大陸的11位號碼,其它國家和地區因國家碼不同號碼長度不同,暫不支持

源碼在此* demo

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。