版本记录
版本号 | 时间 |
---|---|
V1.0 | 2019.02.23 星期六 |
前言
做了好几个APP,碰到了大大小小的很多坑,以前碰到坑,解决了就结束了,这里想把自己碰到的坑记录下来,一来给自己备查二来希望可以帮助到大家。感兴趣的可以关注下,也欢迎大家补充留言,感兴趣的看上面几篇文章。
1. 我的代码我的坑(一) —— 自签名证书导致请求取消的问题(一)
2. 我的代码我的坑(二) —— UIImageView动画点击后动画和图片消失的问题(一)
3. 我的代码我的坑(三) —— iOS9系统WKWebView加载页面白板的问题(一)
4. 我的代码我的坑(四) —— iOS12系统自定义渐变色UISwitch手机横屏的异常问题(一)
5. 我的代码我的坑(五) —— 不可编辑状态的UITextView文本高度大于视图高度默认滚动到底部的问题(一)
问题描述
在很多的需求里面我们都要求UITextField输入内容是限制长度的,还有的需求是超过一个定义的长度就截取固定长度,再输入不能输入的情况。关于截取这个我们都会就用字符串的subString方法进行截取就可以了。
这里有一个问题,就是假如限制输入10个字,但是当你输入8~9个字的时候,这个时候你将键盘调成汉语键盘,想输入拼音打个汉字的时候,这个时候就会发现汉字打不出来不能正常输入,反而将拼音计入长度计算,输入框里末尾出现的就是拼音的一半了,这个体验就很不好了,也就是说无法正常输入最后一个或者两个汉字了。
比如上面这个例子,需求是10个字限制,当我输入9个字,然后打算再输入一个"在"的时候,输入拼音“zai”,就会发现输入框自动截取了拼音的z作为最后一个允许输入的字,不会允许输入汉字了。
问题解决
1. 解决方案
这里不能用简单的length或者subString进行长度截取了,在截取之前一定要判断是不是汉字键盘,如果是的话要单独处理,这样就可以进行正常的最后一个或者两个汉字的输入了,如果不是汉字键盘就按正常的长度进行截取就可以了。
下面我们简单看一下实现
2. 方案实现
这里就是直接看代码了
//增加action
[self.inputTextField addTarget:self action:@selector(textFieldValueChanged:) forControlEvents:UIControlEventEditingChanged];
- (void)textFieldValueChanged:(UITextField *)textField
{
NSString *contentStr = textField.text;
contentStr = [contentStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
if (contentStr.length > 0) { //按钮的发送以及不可发送状态切换
[self.sendButton setTitleColor:[UIColor colorForHex:@"333333"] forState:UIControlStateNormal];
}
else {
[self.sendButton setTitleColor:[UIColor colorForHex:@"999999"] forState:UIControlStateNormal];
}
[self cuttingTheNumber:contentStr length:10];
}
//输入内容自动切除
- (void)cuttingTheNumber:(NSString *)content length:(NSInteger)maxLength
{
NSString *lang = [[self.inputTextField textInputMode] primaryLanguage];
if([lang isEqualToString:@"zh-Hans"])
{
UITextRange *selectedRange = [self.inputTextField markedTextRange];
UITextPosition *position = [self.inputTextField positionFromPosition:selectedRange.start offset:0];
if(!position)
{
if(content.length > maxLength)
{
self.inputTextField.text = [content jjSubString:maxLength];
[JJToastMgr showToast:@"不能超过10个字"];
}
}
}
else{
if(content.length > maxLength)
{
self.inputTextField.text = [content jjSubString:maxLength];
[JJToastMgr showToast:@"不能超过10个字"];
}
}
}
这里jjSubString
是NSString的一个分类,就是切长度用的,具体实现如下所示:
//判断字符串是否为空或者为空字符串
#define StringIsNullOrEmpty(str) (str==nil || [(str) isEqual:[NSNull null]] ||[str isEqualToString:@""])
- (NSString *)jjSubString:(NSInteger)endPos
{
if (StringIsNullOrEmpty(self) || self.length<endPos) {
return self;
}
NSRange range = [self rangeOfComposedCharacterSequenceAtIndex:self.length-1];
if (self.length-range.length > endPos) {
range = [self rangeOfComposedCharacterSequenceAtIndex:endPos-1];
}
if (range.length > 1) {
return [self substringToIndex:range.location];
}
else{
return [self substringToIndex:endPos];
}
}
这样就实现了最后一个或者两个汉字的正常输入了。
后记
本篇主要讲述了UITextField输入长度自动截取时汉字和拼音带来的末位截取不能正常输入汉字的问题,感兴趣的给个赞或者关注~~~