跪求關(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)用封裝的方法就可以了