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. 64位版本的Windows不兼容,masm无法运行解决方法

    问题: 在Window64位运行不了的masm 解决方法: 1.下载DosBox0.74(当前最新): 2.安装后运行,运行后出现控制台: 3.在DosBox的控制台下运行 Mount x: x:/m ...

  2. 异度之刃 Xenoblade 后感

    WII版重置的N3DS劣化版异度之刃终于通关了.在出色的自制系统的快乐NTR的帮助下,充分体验到了神作的剧情史诗感. 关于游戏的玩法系统,从现在来看8年前的游戏,缺点显而易见,特别是跑地图这回事,地图 ...

  3. C/C++内存分区

    C/C++编译的程序占用的内存分区 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数名,局部变量的名等.其操作方式类似于数据结构中的栈. 2.堆区(heap)— 由程序员分配释放, 若 ...

  4. 一、HTML概述 二、web相关的概念 三、HTML的常用标签

    一.HTML概述###<1>概念 HTML:Hypertext Markup Language,超文本 标记语言,用来描述网页的一种语言. 非编程语言,由浏览器直接解释运行. ###< ...

  5. pandas高级操作总结

    1.pandas中的列的分位数 # 查看列的分位数 import pandas as pd # set columns type my_df['col'] = my_df['col'].astype( ...

  6. Service Mesh服务网格新生代——Istio

    Istio 是什么?使用云平台可以为组织提供丰富的好处.然而,不可否认的是,采用云可能会给 DevOps 团队带来压力.开发人员必须使用微服务已满足应用的可移植性,同时运营商管理了极其庞大的混合和多云 ...

  7. Promise & Deferred objects in JavaScript Pt.1: Theory and Semantics.

    原文:http://blog.mediumequalsmessage.com/promise-deferred-objects-in-javascript-pt1-theory-and-semanti ...

  8. Maven实战(十一)eclipse下载依赖jar包出问题

    问题描述 在pom.xml中配置了依赖,但是提示依赖不成功,或在本地仓库找不到相关依赖 大致错误如下: ArtifactDescriptorException: Failed to read arti ...

  9. javascript库概念与连缀

    一.JavaScript 库 1.什么是javascript库: javascript库,说白了,就是把各种常用的代码片段,组织起来放在一个 js 文件里,组成一个包,这个包就是 JavaScript ...

  10. AOP-切面是如何织入到目标对象中的

    切面是如何织入到目标对象中的???这大概是每个人在学习AOP的过程中都会产生的疑问吧. 当我们在调用目标方法时候,也就是通过代理对象调用目标方法的时候,比如:JdkDynamicAopProxy会通过 ...