iOS中限制输入框文字长度的方法有好多,百度一下,最常用的是这种:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if ([textField isEqual:self.nameTextField]) {
NSString *whole = [NSString stringWithFormat:@"%@%@",textField.text, string];
if (range.length == && string.length == ) {
return YES;
}
if ([whole dataUsingEncoding:NSUTF8StringEncoding].length > ) {
[textField resignFirstResponder];
MAKE_TOAST_TOP(LOCALIZESTRING(@"NameLimit"));
return NO;
}
}
return YES;
}

但是这种方法有bug,当输入最后一个汉字的时候,只能输入拼音不能变成汉字。

经过仔细的搜索之后会发现另一中方法:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:UITextFieldTextDidChangeNotification object:self.nameTextField];
- (void)textFieldDidChange:(NSNotification *)noti {
NSString *language = [[UITextInputMode currentInputMode] primaryLanguage];
NSString *string = self.nameTextField.text;
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
if ([language rangeOfString:@"zh-Hans"].length != || [language rangeOfString:@"zh-Hant"].length != ) {
UITextRange *selectedRange = self.nameTextField.markedTextRange;
UITextPosition *position = [self.nameTextField positionFromPosition:selectedRange.start offset:];
if (!position) {
if (data.length > ) {
self.nameTextField.text = [string substringToIndex:];
[self.nameTextField resignFirstResponder];
MAKE_TOAST_TOP(LOCALIZESTRING(@"NameLimit"));
}
} else { }
} else {
if ([self.nameTextField.text dataUsingEncoding:NSUTF8StringEncoding].length > ) {
[self.nameTextField resignFirstResponder];
MAKE_TOAST_TOP(LOCALIZESTRING(@"NameLimit"));
}
}
}

这种方法没有前面说的那种bug,会截取指定长度字符串,但是如果是中英文混合输入的话就没办法根据字节数计算对应的字符串长度,我们希望超过指定字节数时,截取到最后一次输入之前的长度。

可以将上面两种方法结合起来来实现我们的需求:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if (range.length != ) { self.lastInputStringRange = range; }
return YES;
}
- (void)textFieldDidChange:(NSNotification *)noti {
NSString *language = [[UITextInputMode currentInputMode] primaryLanguage];
NSString *string = self.nameTextField.text;
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
if ([language rangeOfString:@"zh-Hans"].length != || [language rangeOfString:@"zh-Hant"].length != ) {
UITextRange *selectedRange = self.nameTextField.markedTextRange;
UITextPosition *position = [self.nameTextField positionFromPosition:selectedRange.start offset:];
if (!position) {
if (data.length > ) {
self.nameTextField.text = [string substringToIndex:self.lastInputStringRange.location];
[self.nameTextField resignFirstResponder];
MAKE_TOAST_TOP(LOCALIZESTRING(@"NameLimit"));
}
} else { }
} else {
if ([self.nameTextField.text dataUsingEncoding:NSUTF8StringEncoding].length > ) {
self.nameTextField.text = [string substringToIndex:];
[self.nameTextField resignFirstResponder];
MAKE_TOAST_TOP(LOCALIZESTRING(@"NameLimit"));
}
}
}

使用变量lastInputStringRange记录最近一次输入的范围,超过指定范围截取字符串时,截取到该位置即可。

iOS 输入框限制输入字节数的更多相关文章

  1. java根据输入的字符串和字节数来截取,输出对应字节数的字符串

    public class Test { //要进行截取操作的字符串 static String ss; //截取的字符串的字节数 static int n; public static void ma ...

  2. 限制EditText 输入的字节数

    1.代码 name_tv = (EditText) findViewById( R.id.name_tv ); name_tv.addTextChangedListener(new TextWatch ...

  3. 面试题之java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 要求不能出现截半的情况

    题目:10. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输 ...

  4. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。

    一.需要分析 1.输入为一个字符串和字节数,输出为按字节截取的字符串--->按照字节[byte]截取操作字符串,先将String转换成byte类型 2.汉字不可以截半--->汉字截半的话对 ...

  5. java算法面试题:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个, 如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉的半个”。

    package com.swift; import java.util.Scanner; public class Hanzi_jiequ { public static void main(Stri ...

  6. IOS使用APNS推送Payload字节数限制导致推送不成功

    这2天须要在推送上加上脚本,找到了badge方法能够加脚本.加上后可是怎么推送也不成功.郁闷了好久.在网上查找相关资料. 最终被我找到原因: "Payload--最多256bytes. &q ...

  7. UITextField最大字符数和最大字节数的限制

    UITextView,UITextfield中有很多坑,网上的方法也很多,但是用过之后暂时没有发现一个好用.这里我给大家几组测试用例可以一试,为啥不好用. 限制10个字节,输入2个Emoj之后是8个字 ...

  8. JS 判断字串字节数,并截取长度

    var matchWords;         function notifyTextLength() {             var inputNum = document.getElement ...

  9. c# 判断字符是否是全角, 获取字符串的字节数 , 获取字符串指定长度字节数的字符串

    1 Encoding.Default.GetByteCount(checkString);  =2 全角 =1 半角 /// <summary> /// 获取字符串的字节长度 /// &l ...

随机推荐

  1. CSS选择器之基本选择器+属性选择器

    1.1      id选择器 #main{ font-size:12px; margin:0; padding:0; } 其中的#main就是id选择器,用于选择HTML页面中id = "m ...

  2. OG数据预处理

    1.影像处理        ogCalcExtent --srs EPSG:26711 --inputdir D:/software/preprocess/data/bugaboos/ --filet ...

  3. Linux+db2+was部署问题总结

     Linux+db2+was部署问题总结 前段日子在住建部进行了Linux环境下,db2+rbp+was的部署,由于是集群,切涉及到了很多was的东西,搞了很长时间,在此做一个问题总结,供后续查询 ...

  4. leetCode题解之反转字符串中的元音字母

    1.问题描述 Reverse Vowels of a String Write a function that takes a string as input and reverse only the ...

  5. maven(19)-生命周期和内置插件

    生命周期和依赖一样,是maven中最重要的核心概念.平时在使用maven时并不一定需要知道生命周期,但是只有明白了生命周期,才能真正理解很多重要的命令和插件配置. default生命周期 defaul ...

  6. SQL Server 数据表代码创建约束

    约束 非空约束 --NN,ont null constraint 必须填写数据不能为空 --指定表 Student 添加名为NN_Student_sClassId非空约束(指定列名sClassId), ...

  7. MySQL 索引的介绍与应用

    Mysql索引 一. mysql 索引 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息. 二:MySQL索引类型 按存储结构区分:聚集索引(又称聚类索引,簇 ...

  8. Win10下安装sulley

    sulley是一款针对网络协议的fuzz框架,记录下安装过程备忘 1.安装MinGW 下载:https://github.com/develersrl/gccwinbinaries/releases/ ...

  9. print in或者not in, 判断在不在里面

    print("不疼" in "麻花疼")        # 结果False print("不疼"in "真不疼") # ...

  10. EF 实体类的制定属性不生成数据库字段

    添加一个标签即可 [NotMapped] 没什么营养,就是防忘记