iOS 输入框限制输入字节数
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 输入框限制输入字节数的更多相关文章
- java根据输入的字符串和字节数来截取,输出对应字节数的字符串
public class Test { //要进行截取操作的字符串 static String ss; //截取的字符串的字节数 static int n; public static void ma ...
- 限制EditText 输入的字节数
1.代码 name_tv = (EditText) findViewById( R.id.name_tv ); name_tv.addTextChangedListener(new TextWatch ...
- 面试题之java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 要求不能出现截半的情况
题目:10. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输 ...
- 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
一.需要分析 1.输入为一个字符串和字节数,输出为按字节截取的字符串--->按照字节[byte]截取操作字符串,先将String转换成byte类型 2.汉字不可以截半--->汉字截半的话对 ...
- 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 ...
- IOS使用APNS推送Payload字节数限制导致推送不成功
这2天须要在推送上加上脚本,找到了badge方法能够加脚本.加上后可是怎么推送也不成功.郁闷了好久.在网上查找相关资料. 最终被我找到原因: "Payload--最多256bytes. &q ...
- UITextField最大字符数和最大字节数的限制
UITextView,UITextfield中有很多坑,网上的方法也很多,但是用过之后暂时没有发现一个好用.这里我给大家几组测试用例可以一试,为啥不好用. 限制10个字节,输入2个Emoj之后是8个字 ...
- JS 判断字串字节数,并截取长度
var matchWords; function notifyTextLength() { var inputNum = document.getElement ...
- c# 判断字符是否是全角, 获取字符串的字节数 , 获取字符串指定长度字节数的字符串
1 Encoding.Default.GetByteCount(checkString); =2 全角 =1 半角 /// <summary> /// 获取字符串的字节长度 /// &l ...
随机推荐
- ComboBox Style
<SolidColorBrush x:Key="ComboBoxNormalBorderBrush" Color="#e3e9ef" /> < ...
- Flutter 控件之 AppBar 和 SliverAppBar
AppBar 和 SliverAppBar 是纸墨设计中的 App Bar,也就是 Android 中的 Toolbar,关于 Toolbar 的设计指南请参考纸墨设计中 Toolbar 的内容. A ...
- svn 同步资源库时忽略某些文件类型和文件夹
项目开发中,开发人员经常用SVN来管理代码,在和服务器同步时,每次都看到一堆.class,.log,target等文件,这样很不舒服. 解决方法: 打开:window-->preferences ...
- 2cmd 窗口 javac 错误:编码GBK的不可映射字符
错误截图: 解决办法:第一步 第二步:
- Object hashcode
java jvm怎么找到一个对象? 一个对象有一个独一无二的hashcode,这样就可以找到这个对象了. 但java 的hashcode 实现的不好,有可能两个不同的对象有一个相同的hashcode, ...
- 登录MySQL提示ERROR 1045 (28000)错误解决方法
今天,登录服务器准备修改数据库的一些东西.但输入密码,却进不了数据库并提示一个错误,如下图 再确认密码没错的情况下,还是进不了数据库.便在网上找到了解决方法,记录下来,供参考学习. 解决方法: 总体思 ...
- Linux 查看双节点是否做了SSH信任
perl $AD_TOP/patch/115/bin/txkRunSSHSetup.pl verifyssh -contextfile=$CONTEXT_FILE -hosts=erpapp1,erp ...
- C# 运行 C#代码脚本文件
https://files.cnblogs.com/files/LittleJin/CSScriptRun.zip
- 使用ModelForm表单验证
1.定义model.py model中定义的字段类型,只有在通过form进行验证的时候才有效,数据库中的字段类型与其并不完全一致,如数据库中并没有ipaddress类型.如果不通过form对字段进行验 ...
- WinPE ISO制作
1.安装ADK,然后导出winPE镜像文件和启动文件: 打开 部署和映像工具环境,cd "Windows Preinstallation Environment",运行 copyp ...