iOS10 自動(dòng)填充手機(jī)號(hào)實(shí)現(xiàn)UITextContentTypeTelephoneNumber

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

今天我們就主要研究下:UITextContentTypeTelephoneNumber 手機(jī)號(hào)碼

效果如圖所示

手機(jī)號(hào)提示效果圖

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

    //此處為處理鍵盤提示號(hào)碼邏輯(如:8618000000000)及(如:+861800000000)
    if (@available(iOS 10.0, *)) {
        //兼容號(hào)碼數(shù)字鍵盤
        if (toBeString.length==13) {
            NSString * startString = [toBeString substringToIndex:3];
            if ([startString isEqualToString:@"861"]) {
                //當(dāng)字符串長(zhǎng)度為13位,并以861開頭時(shí),截取86,余下則為11位手機(jī)號(hào)
                textField.text = [toBeString substringFromIndex:2];
            }
        }
    }
}
4.結(jié)合(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]) {
            //禁輸表情符號(hào)
            return NO;
        }
    }
    return YES;
}
總結(jié):

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

問題點(diǎn):

只支持中國大陸的11位號(hào)碼,其它國家和地區(qū)因國家碼不同號(hào)碼長(zhǎng)度不同,暫不支持

源碼在此* demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容