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ù)制粘貼一次,而且,如果你的頁面里輸入框較多,那么你得很費(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í)語言,也是一門弱語言,它會(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)系作者
【社區(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

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