iOStextFiled判断输入长度
个人在开发当中发现在用textField的代理方法
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
if (textField.text.length > 5) {
textField.text = [textField.text substringToIndex:5];
return;
}
}
中判断长度大小时,键盘中联想出来的文字还是可以输入到textField中。
比如,你的限制是5,输入框已经是5个字了,联想的字是 ‘电话’还可以输入进去。
这个时候可以使用给textField加通知解决
[self.TextField addTarget:self action:@selector(addTextFieldEditChanged:) forControlEvents:UIControlEventEditingChanged];
在通知的方法中判断。
//长度判断
-(void)addSpecsTextFieldEditChanged:(UITextField *)textField{
NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage]; // 键盘输入模式
if ([lang isEqualToString:@"zh-Hans"]) { // 简体中文输入,包括简体拼音,健体五笔,简体手写
}
// 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
else{
if ([textField isEqual:self.countText] ) {
if ([textField.text floatValue] > 999) {
textField.text = [textField.text substringToIndex:4];
[self.toast makeToast:@"库存不能超过999!" duration:2.0 position:CSToastPositionCenter];
return;
}
}
}
if ([textField isEqual:self.specsText] ) {
if (textField.text.length > 20) {
textField.text = [textField.text substringToIndex:20];
[self.toast makeToast:@"规格不能超过20位字符!" duration:2.0 position:CSToastPositionCenter];
return;
}
}
UITextRange *selectedRange = [textField markedTextRange];
//获取高亮部分
UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
// 没有高亮选择的字,则对已输入的文字进行字数统计和限制
if (!position) {
if ([textField isEqual:self.priceText] ) {
if ([textField.text floatValue] >= 1000) {
textField.text = [textField.text substringToIndex:5];
[self.toast makeToast:@"价格不能超过999.99!" duration:2.0 position:CSToastPositionCenter];
return;
}
}
if ([textField isEqual:self.unitText] ) {
if (textField.text.length > 4) {
textField.text = [textField.text substringToIndex:4];
[self.toast makeToast:@"单位不能超过4位字符!" duration:2.0 position:CSToastPositionCenter];
return;
}
}
}
// 有高亮选择的字符串,则暂不对文字进行统计和限制
else{
}
}
//限制小数点
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
if ([ToolClass stringContainsEmoji:string]) { //过滤表情
return NO;
}
if (textField == self.priceText) {
if ([textField.text rangeOfString:@"."].location == NSNotFound) {
self.isHaveDian = NO;
}
if ([string length] > 0) {
unichar single = [string characterAtIndex:0];//当前输入的字符
if ((single >= '0' && single <= '9') || single == '.') {//数据格式正确
//首字母不能为0和小数点
if([textField.text length] == 0){
if(single == '.') {
[textField.text stringByReplacingCharactersInRange:range withString:@""];
return NO;
}
}
//输入的字符是否是小数点
if (single == '.') {
if(!self.isHaveDian)//text中还没有小数点
{
self.isHaveDian = YES;
return YES;
}else{
[textField.text stringByReplacingCharactersInRange:range withString:@""];
return NO;
}
}else{
if (self.isHaveDian) {//存在小数点
//判断小数点的位数
NSRange ran = [textField.text rangeOfString:@"."];
if (range.location - ran.location <= 2) {
return YES;
}else{
[self.toast makeToast:@"小数点后只能输入2位!" duration:2 position:CSToastPositionCenter];
return NO;
}
}else{
return YES;
}
}
}else{//输入的数据格式不正确
[textField.text stringByReplacingCharactersInRange:range withString:@""];
return NO;
}
}
else
{
return YES;
}
}
return YES;
}
//过滤表情
+ (BOOL)stringContainsEmoji:(NSString *)string
{
__block BOOL returnValue = NO;
[string enumerateSubstringsInRange:NSMakeRange(0, [string length])
options:NSStringEnumerationByComposedCharacterSequences
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
const unichar hs = [substring characterAtIndex:0];
if (0xd800 <= hs && hs <= 0xdbff) {
if (substring.length > 1) {
const unichar ls = [substring characterAtIndex:1];
const int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
if (0x1d000 <= uc && uc <= 0x1f77f) {
returnValue = YES;
}else{
returnValue = YES;
}
}
} else if (substring.length > 1) {
const unichar ls = [substring characterAtIndex:1];
if (ls == 0x20e3) {
returnValue = YES;
}else{
returnValue = YES;
}
} else {
if (0x2100 <= hs && hs <= 0x27ff) {
if (10123 <= hs && hs <= 10130) {
returnValue = NO;
}else{
returnValue = YES;
}
} else if (0x2B05 <= hs && hs <= 0x2b07) {
returnValue = YES;
} else if (0x2934 <= hs && hs <= 0x2935) {
returnValue = YES;
} else if (0x3297 <= hs && hs <= 0x3299) {
returnValue = YES;
} else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50) {
returnValue = YES;
}
}
}];
return returnValue;
}
/** *返回字符位数 *传进来字符串计算出字符串中总字符数,其中一个汉字表示2位字符,数字 *字母表示一位字符 */ + (NSInteger) computeStringCharCount:(NSString *)string{ NSInteger count = 0; for (int i=0; i < string.length; i++){ NSRange range = NSMakeRange(i, 1); NSString *subString=[string substringWithRange:range]; const char *cString=[subString UTF8String]; if ([self stringContainsEmoji:string]) { [SRMessage infoMessage:@"不能输入表情!"]; return count; } if (strlen(cString)==3) { count = count + 2; }else if(strlen(cString)==1) { count = count + 1; } } return count; }
浙公网安备 33010602011771号