因?yàn)橹坝龅搅诉@個(gè)問(wèn)題震叙,所以想和大家分享一下趟径。
輸入框是textField激况。
_cardNumberTextField.inputView = [[UIView alloc]initWithFrame:CGRectZero];(需要把系統(tǒng)的鍵盤(pán)的隱藏掉)
第一步
移動(dòng)光標(biāo)的時(shí)候需要知道光標(biāo)移動(dòng)的位置繁涂,所以需要對(duì)textField創(chuàng)建擴(kuò)展類UITextField+ExtentRange
在 .h 里面寫(xiě)入公開(kāi)的方法
- (NSRange) selectedRange;? //獲取光標(biāo)的位置
- (void) setSelectedRange:(NSRange) range;? //設(shè)置光標(biāo)位置
在 .m里面實(shí)現(xiàn)方法
- (NSRange) selectedRange
{
UITextPosition* beginning = self.beginningOfDocument;
UITextRange* selectedRange = self.selectedTextRange;
UITextPosition* selectionStart = selectedRange.start;
UITextPosition* selectionEnd = selectedRange.end;
const NSInteger location = [self offsetFromPosition:beginning toPosition:selectionStart];
const NSInteger length = [self offsetFromPosition:selectionStart toPosition:selectionEnd];
return NSMakeRange(location, length);
}
- (void) setSelectedRange:(NSRange) range? // 備注:UITextField必須為第一響應(yīng)者才有效
{
UITextPosition* beginning = self.beginningOfDocument;
UITextPosition* startPosition = [self positionFromPosition:beginning offset:range.location];
UITextPosition* endPosition = [self positionFromPosition:beginning offset:range.location + range.length];
UITextRange* selectionRange = [self textRangeFromPosition:startPosition toPosition:endPosition];
[self setSelectedTextRange:selectionRange];
}
這樣就可以獲取光標(biāo)的位置了
第二步
我們需要知道這兩個(gè)方法
- (void)insertText:(NSString *)text;
- (void)deleteBackward;
第三步
在controller里面如果是點(diǎn)擊的數(shù)字鍵盤(pán)的時(shí)候我們要實(shí)現(xiàn)的
UIButton *button =? (UIButton *)[self.numberView viewWithTag:sender.tag];
//獲取光標(biāo)的位置
NSRange range = [_cardNumberTextField selectedRange];
//添加
[_cardNumberTextField insertText:button.titleLabel.text];
NSMutableString *spaceString = [NSMutableString stringWithString:_cardNumberTextField.text];
NSMutableString *numberString = [[NSMutableString alloc]init];
//刪除不是數(shù)字的字符并且每四位添加一個(gè)空格(這是因?yàn)橐獙?shí)現(xiàn)每四位添加一個(gè)空格)
numberString = [self deleteNumberAddSpace:spaceString];
_cardNumberTextField.text = numberString;
if ([numberString characterAtIndex:range.location] == ' ') {
range.location++;(因?yàn)樘砑恿艘晃唬韵旅嬖O(shè)置光標(biāo)的時(shí)候需要把光標(biāo)往后面移動(dòng)一位)
}
//設(shè)置光標(biāo)位置
[_cardNumberTextField setSelectedRange:NSMakeRange(range.location + 1, 0)];
這一步是點(diǎn)擊刪除按鈕需要實(shí)現(xiàn)的
if (_cardNumberTextField.text.length < 1 || [_cardNumberTextField.text isEqualToString:@" "]) {
return;
}
//先獲取光標(biāo)的位置
NSRange range = [_cardNumberTextField selectedRange];
if (range.location == 0) {
return;
}
//判斷光標(biāo)的前面是否是空格(如果光標(biāo)前面是空格的話 會(huì)直接刪除空格和空格的前面一位?? 所以下面的方法調(diào)用兩次)
if ([_cardNumberTextField.text characterAtIndex:range.location-1] == ' ') {
[_cardNumberTextField deleteBackward];
[_cardNumberTextField deleteBackward];
range.location-=2; (因?yàn)閯h除了2位篱昔,所以下面設(shè)置光標(biāo)的時(shí)候需要把光標(biāo)往前面移動(dòng)2位,下面同理)
}else {
[_cardNumberTextField deleteBackward];
range.location-=1;
}
NSMutableString *spaceString = [NSMutableString stringWithString:_cardNumberTextField.text];
NSMutableString *numberString = [[NSMutableString alloc]init];
//刪除不是數(shù)字的字符并且每四位添加一個(gè)空格
numberString = [self deleteNumberAddSpace:spaceString];
if (numberString.length < spaceString.length) {
[numberString appendFormat:@" "];
}
_cardNumberTextField.text = numberString;
[_cardNumberTextField setSelectedRange:NSMakeRange(range.location, 0)];
這個(gè)是上面調(diào)取的方法
//刪除不是數(shù)字的字符并且每四位添加一個(gè)空格
- (NSMutableString *)deleteNumberAddSpace:(NSMutableString *)string {
NSMutableString *numberString = [[NSMutableString alloc]init];
? for (int i= 0; i < string.length; i++) {
???? char numberChart = [string characterAtIndex:i];
??? ? ? if (numberChart >= '0' && numberChart <= '9') {
?????? ? ? [numberString appendFormat:@"%c",numberChart];
?????? }
? }
?? for (int i= 0; i < numberString.length; i++) {
???? ? ? if (i % 5 == 4 && i != 0) {
??????? ? ? [numberString insertString:@" " atIndex:i];
?????? }
?? }
return numberString;
}
這樣基本算是完成了始腾,但是如果直接粘貼進(jìn)去的話不會(huì)每四位加一個(gè)空格州刽,所以需要實(shí)現(xiàn)代理方法
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {??
//copy 的按照四位分開(kāi)
NSMutableString *copyString = [NSMutableString stringWithFormat:@"%@%@",textField.text,string];
NSMutableString *numberString = [[NSMutableString alloc]init];
//刪除不是數(shù)字的字符并且每四位添加一個(gè)空格
numberString = [self deleteNumberAddSpace:copyString];
textField.text = numberString;
return NO;
}
這樣基本就實(shí)現(xiàn)了。第一次發(fā)文章浪箭,如果有什么不好的地方請(qǐng)諒解穗椅。