• 对于限制UITextView输入的字符数。相信大家在网上见得最多的是实现UITextViewDelegate

    摘自:方法

- (void)viewDidLoad {

self.titleText = @"意见反馈";

[super viewDidLoad];

self.textView.delegate = self;

self.remainLabel.text = [NSString stringWithFormat:@"您最多还可以输入%d个字",MAX_LIMIT_NUMS];

}

//第一个方法用于限制输入,第二个方法用于动态计算剩余字数

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range

replacementText:(NSString *)text

{

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:NSStringEnumerationByComposedCharacterSequences

usingBlock: ^(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]];

//既然是超出部分截取了,哪一定是最大限制了。

self.remainLabel.text = [NSString stringWithFormat:@"您最多还可以输入%d个字",0];

}

return NO;

}

}

- (void)textViewDidChange:(UITextView *)textView

{

UITextRange *selectedRange = [textView markedTextRange];

//获取高亮部分

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];

}

//不让显示负数

self.remainLabel.text = [NSString stringWithFormat:@"您最多还可以输入%ld个字",MAX(0,MAX_LIMIT_NUMS - existTextNum)];

}

对于限制UITextView输入的字符数的更多相关文章

  1. UITextView 输入字数限制

    本文介绍了UITextView对中英文还有iOS自带表情输入的字数限制,由于中文输入会有联想导致字数限制不准确所以苦恼好久,所以参考一些大神的博客终于搞定,欢迎大家参考和指正. 对于限制UITextV ...

  2. 限制input输入字符数(中文2个字符,英文1个字符)

    input的maxlength可以限制input的输入的字符数,但是是字符串的长度,相当于判断str.length;然而经常会有中文字符算2个字符英文算1个字符的需求,目前只能通过编写代码来实现. & ...

  3. UEditor编辑器 字符数统计和字符数限制 问题

    1.百度UEditor修改右下角统计字数默认只统计前台所见的文字个数,为了便于展示实际保存的时候是保存的包含html标签的,所以右下角的统计字数功能需要修改 getContentLength: fun ...

  4. UITextView 和 UITextField限制字符数和表情符号

    UITextField限制字符数 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)r ...

  5. 【转】android 中如何限制 EditText 最大输入字符数

    原文网址:http://blog.csdn.net/fulinwsuafcie/article/details/7437768 方法一: 在 xml 文件中设置文本编辑框属性作字符数限制 如:andr ...

  6. android 中如何限制 EditText 最大输入字符数

    方法一: 在 xml 文件中设置文本编辑框属性作字符数限制 如:android:maxLength="10" 即限制最大输入字符个数为10 方法二: 在代码中使用InputFilt ...

  7. SecureCRT 如何改变对话框--每行输入字符数的多少

    通过设置Logical columns的大小,选中Retain size an font来改变每行输入字符数的多少 1.设置Session Options–>Terminal–>Emula ...

  8. C 统计用户输入的总行数和字符长度

    C 统计用户输入的总行数和字符长度 #include <stdio.h> #include <Windows.h> int main(void) { ]; ; ; printf ...

  9. iOS UItextView监听输入特定字符跳转页面选择选项返回

    今天有朋友问我一个需求的实现,于是自己写了一个Demo简单的实现了一下: 需求是: 1>比如: 检测用户输入"A"字符串,跳转页面选择选项,将选择的选项放置textView里 ...

随机推荐

  1. BZOJ3532 : [Sdoi2014]Lis

    f[i]表示以i为结尾的LIS长度 对于所有f[i]=1的,由S向i连边 对于所有f[i]=maxf的,由i向T连边 对于j<i,a[j]<a[i],且f[j]+1=f[i]的,j向i连边 ...

  2. 移动端JS 触摸事件基础

    一.手机上的触摸事件   基本事件:   touchstart   //手指刚接触屏幕时触发 touchmove    //手指在屏幕上移动时触发 touchend     //手指从屏幕上移开时触发 ...

  3. winform学习之----图片控件应用(上一张,下一张)

    示例1: int i = 0;        string[] path = Directory.GetFiles(@"C:\Users\Administrator\Desktop\图片&q ...

  4. imread() not working in OpenCV 2.4.11 Debug mode

    The OpenCV function imread() not working in OpenCV 2.4.11 Debug mode of VS2010 under Win32, the way ...

  5. Function Scope

    JavaScript’s function scope means that all variables declared within a function are visi-ble through ...

  6. hdu Super Jumping

    简单的dp,最优子结构是dp[i],即从0~i来看,是的dp[i]最大,然后找到最大中的最大就可以了, 转移方程是:dp[i]=max{dp[i],dp[j]+value[i]},注意这里有两个判断条 ...

  7. while,do while和for循环语句的用法

    一.while的用法 //循环 int i = 10; while(i > 0){ if(i==8) {i--; continue;//跳过 } System.out.println(--i); ...

  8. BZOJ 3289 Mato的文件管理(莫队+离散化求逆序数)

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MB Submit: 2171  Solved: 891 [Submit][Status][ ...

  9. Linux下的mongodb分片部署

    前提: 分片服务器不设置从服务和均衡服务,只有主服务器;当前测试为所有服务器均在同一台物理机上. 1.测试环境:192.168.1.55. 2.测试模式:单机.3.服务:分片服务器1:192.168. ...

  10. Apache Spark源码走读之21 -- WEB UI和Metrics初始化及数据更新过程分析

    欢迎转载,转载请注明出处,徽沪一郎. 概要 WEB UI和Metrics子系统为外部观察监测Spark内部运行情况提供了必要的窗口,本文将简略的过一下其内部代码实现. WEB UI 先上图感受一下sp ...