iOS 限制textField输入的长度
1.电话号码(带3-3-4效果)
- //指定代理
self.phoneTextField.delegate = self;
12//当编辑改变的时候,进行字符校验
[
self
.phoneTextField addTarget:
self
action:
@selector
(reformatAsPhoneNumber:) forControlEvents:UIControlEventEditingChanged];
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889#pragma mark - 手机号码分隔
/**
* 3-3-4手机号码分隔
*/
-(
void
)reformatAsPhoneNumber:(UITextField *)textField {
//判断正确的光标位置
NSUInteger
targetCursorPostion = [textField offsetFromPosition:textField.beginningOfDocument toPosition:textField.selectedTextRange.start];
NSString
*phoneNumberWithoutSpaces = [
self
removeNonDigits:textField.text andPreserveCursorPosition:&targetCursorPostion];
if
([phoneNumberWithoutSpaces length] > 11) {
//避免超过11位的输入
[textField setText:_previousTextFieldContent];
textField.selectedTextRange = _previousSelection;
return
;
}
NSString
*phoneNumberWithSpaces = [
self
insertSpacesEveryFourDigitsIntoString:phoneNumberWithoutSpaces andPreserveCursorPosition:&targetCursorPostion];
textField.text = phoneNumberWithSpaces;
UITextPosition *targetPostion = [textField positionFromPosition:textField.beginningOfDocument offset:targetCursorPostion];
[textField setSelectedTextRange:[textField textRangeFromPosition:targetPostion toPosition:targetPostion]];
}
/**
* 除去非数字字符,确定光标正确位置
*
* @param string 当前的string
* @param cursorPosition 光标位置
*
* @return 处理过后的string
*/
- (
NSString
*)removeNonDigits:(
NSString
*)string andPreserveCursorPosition:(
NSUInteger
*)cursorPosition {
NSUInteger
originalCursorPosition = *cursorPosition;
NSMutableString
*digitsOnlyString = [
NSMutableString
new
];
for
(
NSUInteger
i=0; i<string.length; i++) {
unichar characterToAdd = [string characterAtIndex:i];
if
(isdigit(characterToAdd)) {
NSString
*stringToAdd = [
NSString
stringWithCharacters:&characterToAdd length:1];
[digitsOnlyString appendString:stringToAdd];
}
else
{
if
(i<originalCursorPosition) {
(*cursorPosition)--;
}
}
}
return
digitsOnlyString;
}
/**
* 将空格插入我们现在的string 中,并确定我们光标的正确位置,防止在空格中
*
* @param string 当前的string
* @param cursorPosition 光标位置
*
* @return 处理后有空格的string
*/
- (
NSString
*)insertSpacesEveryFourDigitsIntoString:(
NSString
*)string andPreserveCursorPosition:(
NSUInteger
*)cursorPosition{
NSMutableString
*stringWithAddedSpaces = [
NSMutableString
new
];
NSUInteger
cursorPositionInSpacelessString = *cursorPosition;
for
(
NSUInteger
i=0; i<string.length; i++) {
if
(i>0){
if
(i==3 || i==7) {
[stringWithAddedSpaces appendString:@
" "
];
if
(i<cursorPositionInSpacelessString) {
(*cursorPosition)++;
}
}
}
unichar characterToAdd = [string characterAtIndex:i];
NSString
*stringToAdd = [
NSString
stringWithCharacters:&characterToAdd length:1];
[stringWithAddedSpaces appendString:stringToAdd];
}
return
stringWithAddedSpaces;
}
#pragma mark - UITextFieldDelegate
-(
BOOL
)textField:(UITextField *)textField shouldChangeCharactersInRange:(
NSRange
)range replacementString:(
NSString
*)string {
_previousSelection = textField.selectedTextRange;
_previousTextFieldContent = textField.text;
if
( textField ==
self
.phoneHMDTextField &&range.location >= 11){
return
NO
;
}
else
{
return
YES
;
}
}
二:监听代理方法(这样可以在if里通过判断,做几个textfield的限制输入)
1 2 3 4 5 6 7 8 | -( BOOL )textField:(UITextField *)textField shouldChangeCharactersInRange:( NSRange )range replacementString:( NSString *)string { if ( textField == self .phoneHMDTextField && range.location >= 11){ return NO ; } else { return YES ; } } |
三:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | //指定代理 self .phoneTextField.delegate = self ; //当编辑改变的时候,进行字符校验 [ self .phoneTextField addTarget: self action: @selector (reformatAsPhoneNumber:) forControlEvents:UIControlEventEditingChanged]; //监听字符改变的方法 - ( void )textFieldDidChange:(UITextField *)textField { if (textField == self .textFieldName) { if (textField.text.length > 15) { UITextRange *markedRange = [textField markedTextRange]; if (markedRange) { return ; } //Emoji占2个字符,如果是超出了半个Emoji,用15位置来截取会出现Emoji截为2半 //超出最大长度的那个字符序列(Emoji算一个字符序列)的range NSRange range = [textField.text rangeOfComposedCharacterSequenceAtIndex:15]; textField.text = [textField.text substringToIndex:range.location]; } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步