iOS高度封裝格式化手機(jī)號(hào),銀行卡輸入樣式,限制輸入內(nèi)容

跪求關(guān)注,最近準(zhǔn)備離職,想把博客撐上去好找工作,不求喜歡拥褂,求關(guān)注,謝謝了

最近整理一下之前的代碼,實(shí)現(xiàn)高度封裝和復(fù)用

總結(jié)一下輸入框格式化,方便用戶輸入和增加用戶體驗(yàn),基本效果如下

用戶在輸入電話號(hào)碼的時(shí)候自動(dòng)格式化為123 4567 8901
用戶在輸入銀行卡號(hào)的時(shí)候自動(dòng)格式化為1234 1234 1234 1234 123(16-19位)
用戶在輸入金錢的時(shí)候自動(dòng)判斷兩位,一個(gè)小數(shù)點(diǎn),如123.12
任意限制輸入內(nèi)容的輸入框(不在允許輸入范圍內(nèi)的東西不顯示)


效果圖

我們本來這些代碼是要寫在textField的代理方法中.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;

通過這個(gè)方法,判定輸入內(nèi)容返回YES或者NO來限制是否能夠輸入進(jìn)去,但是這樣會(huì)有一個(gè)問題,就是你用一次你得去復(fù)制粘貼一次,而且,如果你的頁(yè)面里輸入框較多,那么你得很費(fèi)勁的去寫swich case或者一長(zhǎng)串的if else,不僅麻煩,而且顯得很low

那么我們想,能不能把方法封裝在tf內(nèi)部,提供一個(gè)外部方法讓我們調(diào)用判斷,我們?cè)诖矸椒ɡ镎{(diào)用一下就行了,但是這樣還會(huì)出現(xiàn)一個(gè)問題就是,我們不得不把代理方法里面UITextField換成你要判斷的類,不然就會(huì)找不到這個(gè)方法,從而報(bào)錯(cuò).

那么我們想到另一個(gè)方法來解決這個(gè)問題,就是通過類的擴(kuò)展,去橋接這個(gè)方法.

我們知道OC是動(dòng)態(tài)運(yùn)行時(shí)語(yǔ)言,也是一門弱語(yǔ)言,它會(huì)在運(yùn)行時(shí)找到對(duì)應(yīng)的類去調(diào)用相應(yīng)的方法,所以,給跟類UITextField添加一個(gè)同名的方法,在運(yùn)行時(shí)調(diào)用的時(shí)候,每個(gè)類自己調(diào)用自己對(duì)應(yīng)的方法就可以了

方法如下
首先,給textFeld寫一個(gè)擴(kuò)展類,在類中聲明一個(gè)方法,不用寫方法的實(shí)現(xiàn),因?yàn)橛貌坏?/p>

#import <UIKit/UIKit.h>

@interface UITextField (Extension)
// 自定義一個(gè)方法,每個(gè)自定義封裝的TF都實(shí)現(xiàn)這個(gè)方法就可以了
- (BOOL)valueChangeValueString:(NSString *)string shouldChangeCharactersInRange:(NSRange)range;

@end

剩下的就是每個(gè)封裝的TF的自定義方法內(nèi)容了

  • 格式化手機(jī)號(hào)代碼
#import "JXHIphoneTF.h"

@implementation JXHIphoneTF
- (BOOL)valueChangeValueString:(NSString *)string shouldChangeCharactersInRange:(NSRange)range
{
    
    NSString *text = self.text;
    
    NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789\\b"];
    string = [string stringByReplacingOccurrencesOfString:@" " withString:@""];
    if ([string rangeOfCharacterFromSet:[characterSet invertedSet]].location != NSNotFound) {
        return NO;
    }
    NSLog(@"%@",NSStringFromRange(range));
    text = [text stringByReplacingCharactersInRange:range withString:string];
    text = [text stringByReplacingOccurrencesOfString:@" " withString:@""];
    
    NSString *newString = @"";
    
    NSString *subString = [text substringToIndex:MIN(text.length, 3)];
    
    newString = [newString stringByAppendingString:subString];
    if (subString.length == 3) {
        newString = [newString stringByAppendingString:@" "];
    }
    
    text = [text substringFromIndex:MIN(text.length, 3)];
    
    if (text.length > 0) {
        NSString *subString2 = [text substringToIndex:MIN(text.length, 4)];
        newString = [newString stringByAppendingString:subString2];
        if (subString2.length == 4) {
            newString = [newString stringByAppendingString:@" "];
            
        }
        NSString *subString3 = [text substringFromIndex:MIN(text.length, 4)];
        newString = [newString stringByAppendingString:subString3];
        
    }
    
    newString = [newString stringByTrimmingCharactersInSet:[characterSet invertedSet]];
    
    
    if (newString.length >= 14) {
        return NO;
    }
    
    [self setText:newString];
    
    return NO;
}
@end
  • 格式化銀行卡信息
#import "JXHBankCardTF.h"

@interface JXHBankCardTF ()

@end

@implementation JXHBankCardTF


- (void)awakeFromNib
{
    [super awakeFromNib];
    [self setUp];
}

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // 初始化
        [self setUp];
    }
    return self;
}


- (void)setUp
{
    
}

- (BOOL)valueChangeValueString:(NSString *)string shouldChangeCharactersInRange:(NSRange)range
{
    
    NSString *text = self.text;
    
    NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789\\b"];
    string = [string stringByReplacingOccurrencesOfString:@" " withString:@""];
    if ([string rangeOfCharacterFromSet:[characterSet invertedSet]].location != NSNotFound) {
        return NO;
    }
    
    text = [text stringByReplacingCharactersInRange:range withString:string];
    text = [text stringByReplacingOccurrencesOfString:@" " withString:@""];
    
    NSString *newString = @"";
    while (text.length > 0) {
        NSString *subString = [text substringToIndex:MIN(text.length, 4)];
        newString = [newString stringByAppendingString:subString];
        if (subString.length == 4) {
            newString = [newString stringByAppendingString:@" "];
        }
        text = [text substringFromIndex:MIN(text.length, 4)];
    }
    
    newString = [newString stringByTrimmingCharactersInSet:[characterSet invertedSet]];
    
    
    if (newString.length >= 24) {
        return NO;
    }
    
    [self setText:newString];
    
    return NO;
}
@end
  • 限制輸入錢款樣式(兩位小數(shù))
#import "JXHMoneyTF.h"

@implementation JXHMoneyTF


- (BOOL)valueChangeValueString:(NSString *)string shouldChangeCharactersInRange:(NSRange)range
{
    NSString *text             = self.text;
    NSString *decimalSeperator = @".";
    NSCharacterSet *charSet    = nil;
    NSString *numberChars      = @"0123456789";
    
    if ([string isEqualToString:decimalSeperator] && [text length] == 0) {
        return NO;
    }
    
    NSRange decimalRange = [text rangeOfString:decimalSeperator];
    BOOL isDecimalNumber = (decimalRange.location != NSNotFound);
    if (isDecimalNumber) {
        charSet = [NSCharacterSet characterSetWithCharactersInString:numberChars];
        if ([string rangeOfString:decimalSeperator].location != NSNotFound) {
            return NO;
        }
    }
    else {
        numberChars = [numberChars stringByAppendingString:decimalSeperator];
        charSet = [NSCharacterSet characterSetWithCharactersInString:numberChars];
    }
    
    NSCharacterSet *invertedCharSet = [charSet invertedSet];
    NSString *trimmedString = [string stringByTrimmingCharactersInSet:invertedCharSet];
    text = [text stringByReplacingCharactersInRange:range withString:trimmedString];
    
    if (isDecimalNumber) {
        NSArray *arr = [text componentsSeparatedByString:decimalSeperator];
        if ([arr count] == 2) {
            if ([arr[1] length] > 2) {
                return NO;
            }
        }
    }
    
    self.text = text;
    return NO;
}

@end

  • 限制任意輸入內(nèi)容
#import "JXHNumberTF.h"

@implementation JXHNumberTF

- (BOOL)valueChangeValueString:(NSString *)string shouldChangeCharactersInRange:(NSRange)range
{
    NSString *text = self.text;

    NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789\\b"];
    
    if ([string rangeOfCharacterFromSet:[characterSet invertedSet]].location != NSNotFound) {
        return NO;
    }
    
    text = [text stringByReplacingCharactersInRange:range withString:string];
    text = [text stringByReplacingOccurrencesOfString:@" " withString:@""];
    [self setText:text];
    return NO;
    
}
@end
// 這個(gè)方法你可以自己定義,不如說只能輸入abc,那么你把
   NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789\\b"];
// 這個(gè)方法改成
   NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:@"abc\\b"];
// 就可以了






github地址: 代碼展示

代碼展示

使用方便, 只需要將你需要的輸入框樣式拖入你的程序中,創(chuàng)建相應(yīng)的TF 然后把橋接的擴(kuò)展文件拖入工程后在代理方法里調(diào)用封裝的方法就可以了

注意一下,格式化用了之后傳值的時(shí)候要把空格去除掉

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末牙寞,一起剝皮案震驚了整個(gè)濱河市饺鹃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌间雀,老刑警劉巖悔详,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異惹挟,居然都是意外死亡茄螃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門连锯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來归苍,“玉大人,你說我怎么就攤上這事运怖∑雌” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵摇展,是天一觀的道長(zhǎng)吻氧。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么医男? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任砸狞,我火速辦了婚禮捻勉,結(jié)果婚禮上镀梭,老公的妹妹穿的比我還像新娘。我一直安慰自己踱启,他們只是感情好报账,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著埠偿,像睡著了一般透罢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冠蒋,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天羽圃,我揣著相機(jī)與錄音,去河邊找鬼抖剿。 笑死朽寞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斩郎。 我是一名探鬼主播脑融,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼缩宜!你這毒婦竟也來了肘迎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤锻煌,失蹤者是張志新(化名)和其女友劉穎妓布,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宋梧,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡匣沼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乃秀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肛著。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖跺讯,靈堂內(nèi)的尸體忽然破棺而出枢贿,到底是詐尸還是另有隱情,我是刑警寧澤刀脏,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布局荚,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏耀态。R本人自食惡果不足惜轮傍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望首装。 院中可真熱鬧创夜,春花似錦、人聲如沸仙逻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)系奉。三九已至檬贰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缺亮,已是汗流浹背翁涤。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留萌踱,地道東北人葵礼。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像虫蝶,于是被迫代替她去往敵國(guó)和親章咧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容