iOS基于UITextView的字数限制和输入量显示

2023-11-29 06:58

本文主要是介绍iOS基于UITextView的字数限制和输入量显示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#define MAX_LIMIT_NUMS 50
//显示输入字数和限制数_textNumLab = [[UILabel alloc] init];_textNumLab.font = GetFont(FONT_BUTTON);_textNumLab.text = @"0/50";_textNumLab.textAlignment = 2;[self addSubview:_textNumLab];#pragma mark -限制病情描述输入字数(最多不超过MAX_LIMIT_NUMS个字)
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{//不支持系统表情的输入if ([[textView textInputMode]primaryLanguage]==nil||[[[textView textInputMode]primaryLanguage]isEqualToString:@"emoji"]) {return NO;}UITextRange *selectedRange = [textView markedTextRange];//获取高亮部分UITextPosition *pos = [textView positionFromPosition:selectedRange.start offset:0];//获取高亮部分内容//NSString * selectedtext = [textView textInRange:selectedRange];//如果有高亮且当前字数开始位置小于最大限制时允许输入if (selectedRange && pos) {NSInteger startOffset = [textView offsetFromPosition:textView.beginningOfDocument toPosition:selectedRange.start];NSInteger endOffset = [textView offsetFromPosition:textView.beginningOfDocument toPosition:selectedRange.end];NSRange offsetRange =NSMakeRange(startOffset, endOffset - startOffset);if (offsetRange.location <MAX_LIMIT_NUMS) {return YES;}else{return NO;}}NSString *comcatstr = [textView.text stringByReplacingCharactersInRange:range withString:text];NSInteger caninputlen =MAX_LIMIT_NUMS - comcatstr.length;if (caninputlen >=0){return YES;}else{NSInteger len = text.length + caninputlen;//防止当text.length + caninputlen < 0时,使得rg.length为一个非法最大正数出错NSRange rg = {0,MAX(len,0)};if (rg.length >0){NSString *s =@"";//判断是否只普通的字符或asc码(对于中文和表情返回NO)BOOL asc = [text canBeConvertedToEncoding:NSASCIIStringEncoding];if (asc) {s = [text substringWithRange:rg];//因为是ascii码直接取就可以了不会错}else{__block NSInteger idx =0;__block NSString  *trimString =@"";//截取出的字串//使用字符串遍历,这个方法能准确知道每个emoji是占一个unicode还是两个[text enumerateSubstringsInRange:NSMakeRange(0, [text length])options:NSStringEnumerationByComposedCharacterSequencesusingBlock: ^(NSString* substring,NSRange substringRange,NSRange enclosingRange,BOOL* stop) {if (idx >= rg.length) {*stop =YES;//取出所需要就break,提高效率return ;}trimString = [trimString stringByAppendingString:substring];idx++;}];s = trimString;}//rang是指从当前光标处进行替换处理(注意如果执行此句后面返回的是YES会触发didchange事件)[textView setText:[textView.text stringByReplacingCharactersInRange:range withString:s]];//既然是超出部分截取了,哪一定是最大限制了。_textNumLab.text = [NSString stringWithFormat:@"%d/%ld",0,(long)MAX_LIMIT_NUMS];}return NO;}
}#pragma mark -显示当前可输入字数/总字数
- (void)textViewDidChange:(UITextView *)textView{UITextRange *selectedRange = [textView markedTextRange];if (_delegate && [_delegate respondsToSelector:@selector(didChangeValue:cell:)]) {[_delegate didChangeValue:textView.text cell:self];}//获取高亮部分UITextPosition *pos = [textView positionFromPosition:selectedRange.start offset:0];//如果在变化中是高亮部分在变,就不要计算字符了if (selectedRange && pos) {return;}NSString  *nsTextContent = textView.text;NSInteger existTextNum = nsTextContent.length;if (existTextNum >MAX_LIMIT_NUMS){//截取到最大位置的字符(由于超出截部分在should时被处理了所在这里这了提高效率不再判断)NSString *s = [nsTextContent substringToIndex:MAX_LIMIT_NUMS];[textView setText:s];}//    //不让显示负数(倒计数)
//    _textNumLab.text = [NSString stringWithFormat:@"%ld/%d",MAX(0,MAX_LIMIT_NUMS - existTextNum),MAX_LIMIT_NUMS];
//正向计数_textNumLab.text = [NSString stringWithFormat:@"%ld/%d",MIN(50,existTextNum),MAX_LIMIT_NUMS];
}

效果图如下:
这里写图片描述

这篇关于iOS基于UITextView的字数限制和输入量显示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/431876

相关文章

如何设置vim永久显示行号

《如何设置vim永久显示行号》在Linux环境下,vim默认不显示行号,这在程序编译出错时定位错误语句非常不便,通过修改vim配置文件vimrc,可以在每次打开vim时永久显示行号... 目录设置vim永久显示行号1.临时显示行号2.永www.chinasem.cn久显示行号总结设置vim永久显示行号在li

SpringBoot实现基于URL和IP的访问频率限制

《SpringBoot实现基于URL和IP的访问频率限制》在现代Web应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段,为了保护系统资源,需要对接口的访问频率进行限制,下面我们就来看看如何使用... 目录1. 引言2. 项目依赖3. 配置 Redis4. 创建拦截器5. 注册拦截器6. 创建控制器8.

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

Linux限制ip访问的解决方案

《Linux限制ip访问的解决方案》为了修复安全扫描中发现的漏洞,我们需要对某些服务设置访问限制,具体来说,就是要确保只有指定的内部IP地址能够访问这些服务,所以本文给大家介绍了Linux限制ip访问... 目录背景:解决方案:使用Firewalld防火墙规则验证方法深度了解防火墙逻辑应用场景与扩展背景:

如何提高Redis服务器的最大打开文件数限制

《如何提高Redis服务器的最大打开文件数限制》文章讨论了如何提高Redis服务器的最大打开文件数限制,以支持高并发服务,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

poj 2135 有流量限制的最小费用最大流

题意: 农场里有n块地,其中约翰的家在1号地,二n号地有个很大的仓库。 农场有M条道路(双向),道路i连接着ai号地和bi号地,长度为ci。 约翰希望按照从家里出发,经过若干块地后到达仓库,然后再返回家中的顺序带朋友参观。 如果要求往返不能经过同一条路两次,求参观路线总长度的最小值。 解析: 如果只考虑去或者回的情况,问题只不过是无向图中两点之间的最短路问题。 但是现在要去要回

poj 3422 有流量限制的最小费用流 反用求最大 + 拆点

题意: 给一个n*n(50 * 50) 的数字迷宫,从左上点开始走,走到右下点。 每次只能往右移一格,或者往下移一格。 每个格子,第一次到达时可以获得格子对应的数字作为奖励,再次到达则没有奖励。 问走k次这个迷宫,最大能获得多少奖励。 解析: 拆点,拿样例来说明: 3 2 1 2 3 0 2 1 1 4 2 3*3的数字迷宫,走两次最大能获得多少奖励。 将每个点拆成两个