我們在開發(fā)的時(shí)候經(jīng)常會(huì)碰到這樣的問題:一個(gè)APP上有很多個(gè)TextField存在于不同的頁面上峦朗,這時(shí)候客戶或者項(xiàng)目經(jīng)理要求我們對每一個(gè)TextField做不同的檢驗(yàn)判斷(即其中一個(gè)輸入框只能輸入中文鹰溜,另外一個(gè)輸入框只能輸入數(shù)字或者英文等)落剪。最近本人碰到這樣的一個(gè)要求擒贸,最開始的時(shí)候想著用TextField代理的方式來判斷故源,但是這樣的話對于APP上存在很多的輸入框的項(xiàng)目來說比較繁瑣魏烫,因?yàn)檫@樣的話我們需要在代理中判斷當(dāng)前響應(yīng)的是哪一個(gè)輸入框怖亭,還要在所有存在輸入框的頁面上加上代理沐鼠。那么有沒有一種方法更好的方法來解決這樣的問題呢挚瘟。于是我想到在AppDelegate中增加監(jiān)聽來檢測APP中存在的所有輸入框以實(shí)現(xiàn)這一需求。實(shí)現(xiàn)邏輯如下:
1饲梭、給TextField增加一個(gè)屬性乘盖,我們在頁面上add TextField時(shí)給這個(gè)屬性一個(gè)值;
2憔涉、在AppDelegate中增加監(jiān)聽來檢測APP中所有的輸入框订框;
3、監(jiān)聽到當(dāng)前輸入框的動(dòng)態(tài)時(shí)來通過正則表達(dá)式來判斷輸入的字符是否符合我們的規(guī)范兜叨。
以下為關(guān)鍵實(shí)現(xiàn)代碼:
給TextField增加屬性:我采用的是類別(Category)來給TextField增加一個(gè)自定義的屬性
//在TextField中新建一個(gè)textType屬性
@property (nonatomic , copy)NSString? *textType;
所以就需要在.m中通過runtime來寫這個(gè)屬性的set 和get方法
static const void *tagKey = &tagKey;
@implementation UITextField (TextType)
- (NSString *)textType{
return objc_getAssociatedObject(self, tagKey);
}
- (void)setTextType:(NSString *)textType{
objc_setAssociatedObject(self, tagKey, textType, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
因?yàn)橛玫搅藃untime穿扳,就需要我們導(dǎo)入
#import <objc/runtime.h>
這樣給TextField增加一個(gè)自定義屬性就做好了,接下來要給我們需要校驗(yàn)的TextField的這一屬性賦值
inputTextField.textType = @"ACCOUNTNUM";
我們通過在APPDelegate中來監(jiān)聽APP中所有的輸入框国旷。在這里我用了兩個(gè)通知中心來實(shí)現(xiàn)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(beginEditingAction:) name:UITextFieldTextDidBeginEditingNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(infoAction:) name:UITextFieldTextDidChangeNotification object:nil];
第一個(gè)通知來得到我們開始編輯的TextField的原始值
- (void)beginEditingAction:(NSNotification *)aNotification{
UITextField *textField = (UITextField *)aNotification.object;
_textStr = textField.text;
}
第二個(gè)通知來判斷我們輸入的字符串符不符合要求矛物,我們首先需要一個(gè)通過正則表達(dá)式判斷是否符合規(guī)范的方法
- (BOOL)validateAccount:(NSString *)textString{
NSString *number = @"^[0-9xX]+$";
NSPredicate *numberPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",number];
return [numberPre evaluateWithObject:textString];
}
然后開始判斷
- (void)infoAction:(NSNotification *)aNotification{
UITextField *textField = (UITextField *)aNotification.object ;
/**
_textStr為我們輸入字符串之前的TextField的值
**/
NSString *headStr = _textStr;
/**
判斷用戶是否進(jìn)行了刪除操作,如果進(jìn)行了刪除操作則該方法return
**/
if (textField.text.length < _textStr.length) {
_textStr = textField.text;
return;
}
/**
得到輸入的字符串
**/
NSString *footStr = [textField.text substringFromIndex:_textStr.length];
/**
判斷該textField需要滿足哪一種校驗(yàn)
**/
if ([textField.textType isEqualToString:@"ACCOUNTNUM"]) {
if ([self validateAccount:footStr]) {
/**
當(dāng)輸入的字符串符合規(guī)范時(shí)把新輸入的字符串添加到輸入框顯示的字符串中
**/
_textStr = [NSString stringWithFormat:@"%@%@",headStr,footStr];
}else{
/**
不符合規(guī)范時(shí)輸入框的內(nèi)容依然為我們輸入字符串之前的值
**/
textField.text = headStr;
}
}else if ([textField.textType isEqualToString:@"NAME"]){
}
else{
NSLog(@"other");
}
}
以上即為我們實(shí)現(xiàn)這一功能的全部邏輯及實(shí)現(xiàn)代碼跪但。
ps:謝謝小章同學(xué)的大力支持履羞。本人系iOS小白,還在對于iOS的學(xué)習(xí)還在摸索中特漩。不喜勿噴吧雹,歡迎指正骨杂。:)