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. EJB JBOSS的安装

    下载地址:http://www.jboss.org/jbossas/downloads 下载JBoss 4.2.3-->解压 启动:bin-->run.bat 管理后台:www.local ...

  2. Ubuntu 16.04 小飞机启动失败

    好长时间没用小飞机了,今天打开发现,无法启动了. 查看了日志: Initialising ciphers... AES-256/CFB (aes-256-cfb) initialised. Runni ...

  3. CSS 0.5px 细线边框的原理和实现方式

    细线边框的具体实现方法有:伪元素缩放或渐变,box-shadow模拟,svg画线,border-image裁剪等.要实现小于1px的线条,有个先决条件:屏幕的分辨率要足够高,设备像素比要大于1,即cs ...

  4. leetCode题解单链表反转

    1.题目描述 反转一个单链表.链表节点结构如下: struct ListNode { int val; ListNode* next; }; 2.问题分析 特殊情况是输入的头结点是一个空的,或者只有一 ...

  5. Spring常用注解简单汇总

    使用注解之前要开启自动扫描功能,其中base-package为需要扫描的包(含子包). <context:component-scan base-package="cn.test&qu ...

  6. 只能在堆上生成的对象 VS. 只能在栈上生成的对象

    1. 只能在堆上 即禁止在栈上生成.如何实现? 当对象建立在栈上面时,是由编译器分配内存空间的,调用构造函数来构造栈对象.如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存. 所以,只需 ...

  7. [CENTOS7] [IPTABLES] 卸载Firewall Id安装 IPTABLES及防火墙设置

    卸载Firewall ID,重装IPTABLES:先停止服务 systemctl stop firewalldsystemctl mask firewalld   yum install iptabl ...

  8. 记开发个人图书收藏清单小程序开发(十)DB开发——新增图书信息

    昨晚完成了Web端新增图书信息的功能,现在就差DB的具体实现了. 因为我把Book相关的信息拆分的比较多,所以更新有点小麻烦. 首先,我需要创建一个Book Type的Matter: 然后,将图片路径 ...

  9. 使用CoreData [3]

    使用CoreData [3] 此篇幅介绍CoreData如何升级版本防止崩溃 把你之前创建的实体文件全部删除掉,把沙盒中的数据库文件删除掉,实体只保持一个,然后重新创建出实体文件. - (BOOL)a ...

  10. [翻译] ALMoviePlayerController

    ALMoviePlayerController ALMoviePlayerController is a drop-in replacement for MPMoviePlayerController ...