iOS-Main-UITextField只允許輸入中,英文,數(shù)字

前言:
UITextField其實研究下發(fā)現(xiàn)有許多細微的問題裤园,比如監(jiān)控text的的值公罕。
有可能你會說,用KVO或者用代理,相比較之下侯养,代理比較靠譜。
要用代理的話澄干,我們必須要明白下面這個方法是什莫意思:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
輸入字符時逛揩,會調用這個方法。通過這個方法可以達到過濾掉鍵盤輸入的文字超長的效果麸俘。確實辩稽,這個在你輸入英文的時候,確實比較靠譜从媚,每次你輸入一個字母或者數(shù)字的時候都會觸發(fā)逞泄,用來處理或是屏蔽一些特殊字符的。

問題:但是拜效,如果你用中文輸入法喷众,你在輸入拼音的時候,他會進入這個代理方法紧憾,等你去選擇你需要的漢字后到千,他就顯示在了textField上面,這也沒錯赴穗,問題是他不會觸發(fā)上面這個方法憔四。

在這里,我們研究的只是UITextField只允許輸入中,英文,數(shù)字望抽。

思維導圖


示例代碼
#import "ViewController.h"
#define kMaxLength 20
@interface ViewController ()<UITextFieldDelegate>

/**
輸入框
 */
@property (weak, nonatomic) IBOutlet UITextField *inPutTextField;
@end
@implementation ViewController
- (void)viewDidLoad {
   [super viewDidLoad];
[_inPutTextField addTarget:self action:@selector(textFieldChanged:) forControlEvents:UIControlEventEditingChanged];
NSLog(@"%@-",_inPutTextField.text);
}
#pragma mark - UITextFieldDelegate
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
 {
if ([self isInputRuleAndNumber:string] || [string isEqualToString:@""]) {
    return YES;
}
return NO;
}
#pragma mark - 觸發(fā)事件
- (void)textFieldChanged:(UITextField *)textField
{
>
NSString *toBeString = textField.text;
NSString *lastString;
if(toBeString.length>0)
    lastString=[toBeString substringFromIndex:toBeString.length-1];
>
if (![self isInputRuleAndNumber:toBeString]&&[self hasEmoji:lastString]) {
    textField.text = [self disable_emoji:toBeString];
    return;
}
NSString *lang = [[textField textInputMode] primaryLanguage];
if([lang isEqualToString:@"zh-Hans"]) {
    UITextRange *selectedRange = [textField markedTextRange];
    UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
    if(!position) {
        NSString *getStr = [self getSubString:toBeString];
        if(getStr && getStr.length > 0) {
            textField.text = getStr;
        }
    }
} else{
    NSString *getStr = [self getSubString:toBeString];
    if(getStr && getStr.length > 0) {
        textField.text= getStr;
    }
}
NSLog(@"%zd",textField.text.length);
}
#pragma mark - 謂詞條件限制
/**
 pattern中,輸入需要驗證的通過的字符
 小寫a-z
 大寫A-Z
 漢字\u4E00-\u9FA5
 數(shù)字\u0030-\u0039
 @param str 要過濾的字符
 @return YES 只允許輸入字母和漢字
 */
- (BOOL)isInputRuleAndNumber:(NSString *)str {
  NSString *pattern = @"[a-zA-Z\u4E00-\u9FA5\\u0030-\\u0039]";
  NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
  BOOL isMatch = [pred evaluateWithObject:str];
return isMatch;
}
/*
*實現(xiàn)判斷是否是Emoji
*/
- (BOOL)hasEmoji:(NSString*)str{
NSString *pattern = @"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
BOOL isMatch = [pred evaluateWithObject:str];
return isMatch;
}
- (NSString *)disable_emoji:(NSString *)text
{
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]" options:NSRegularExpressionCaseInsensitive error:nil];
NSString *modifiedString = [regex stringByReplacingMatchesInString:text
                                                           options:0
                                                             range:NSMakeRange(0, [text length])
                                                      withTemplate:@""];
return modifiedString;
}
/*
* 限制字符長度為 20
*/
-(NSString *)getSubString:(NSString*)string
{
NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);//ios手機端通過后臺獲取含有中文時加矛,出現(xiàn)亂碼
NSData* data = [string dataUsingEncoding:encoding];
NSInteger length = [data length];
if (length > kMaxLength) {
    NSData *data1 = [data subdataWithRange:NSMakeRange(0, kMaxLength)];
    NSString *content = [[NSString alloc] initWithData:data1 encoding:encoding];
    if (!content || content.length == 0) {
        data1 = [data subdataWithRange:NSMakeRange(0, kMaxLength - 1)];
        content =  [[NSString alloc] initWithData:data1 encoding:encoding];
    }
    return content;
}
return nil;
}
 @end

參考文章:
1. 字符串編碼轉換(GBK) NSString, char, NSData相互轉化
2. UITextField只允許輸入中,英文,數(shù)字
3. 一篇關于監(jiān)控UITextField的軟文
對于本篇文章,是我學習參考文章2所獲煤篙,不知道是否完善斟览,如有建議,請?zhí)岢觯?/strong>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末辑奈,一起剝皮案震驚了整個濱河市苛茂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鸠窗,老刑警劉巖妓羊,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異稍计,居然都是意外死亡躁绸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來净刮,“玉大人剥哑,你說我怎么就攤上這事⊙透福” “怎么了株婴?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長暑认。 經(jīng)常有香客問我困介,道長,這世上最難降的妖魔是什么蘸际? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮粮彤,結果婚禮上八回,老公的妹妹穿的比我還像新娘。我一直安慰自己驾诈,他們只是感情好,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布溶浴。 她就那樣靜靜地躺著乍迄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪士败。 梳的紋絲不亂的頭發(fā)上闯两,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機與錄音谅将,去河邊找鬼漾狼。 笑死,一個胖子當著我的面吹牛饥臂,可吹牛的內容都是我干的逊躁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼隅熙,長吁一口氣:“原來是場噩夢啊……” “哼稽煤!你這毒婦竟也來了?” 一聲冷哼從身側響起囚戚,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤酵熙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后驰坊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匾二,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了察藐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片皮璧。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖转培,靈堂內的尸體忽然破棺而出恶导,到底是詐尸還是另有隱情,我是刑警寧澤浸须,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布惨寿,位于F島的核電站,受9級特大地震影響删窒,放射性物質發(fā)生泄漏裂垦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一肌索、第九天 我趴在偏房一處隱蔽的房頂上張望蕉拢。 院中可真熱鬧,春花似錦诚亚、人聲如沸晕换。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闸准。三九已至,卻和暖如春梢灭,著一層夾襖步出監(jiān)牢的瞬間夷家,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工敏释, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留库快,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓钥顽,卻偏偏與公主長得像义屏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子耳鸯,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內容