@interface DMFeedbackViewController ()<UITextViewDelegate,UIAlertViewDelegate>
@property (nonatomic, strong) UITextView *feedbackTextView;//意见反馈输入框
@property (nonatomic, strong) UILabel *mostLabel;//最多还可以输入
@property (nonatomic, strong) UIButton *submitBt;//提交
@property (nonatomic, strong) UILabel *feedbackNoteLabel;//在此输入反馈意见
@end

判断用户是否输入文字,feedbackNoteLabel文字显示或者隐藏

利用通知解决:

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textViewChange) name:UITextViewTextDidChangeNotification object:nil];

//释放通知

-(void)dealloc
{
    
    //    debugMethod();
    [[NSNotificationCenter defaultCenter]removeObserver:self name:UITextViewTextDidChangeNotification object:nil];
    
    }

-(void)textViewChange
{
    
    if (_feedbackTextView.text.length== 0) {
        [_feedbackNoteLabel setHidden:NO];
        
        
    }else
    {
        [_feedbackNoteLabel setHidden:YES];
        
    }
    
}
由于设计需要,uitextview的输入框特别长,提交按钮在最底部,为了方便用户体验,添加了拖拽也就是滑动手势

UIPanGestureRecognizer  *panGestureRecognizer= [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGestures:)];
    panGestureRecognizer.minimumNumberOfTouches = 1;
    panGestureRecognizer.maximumNumberOfTouches = 5;
    [self.view addGestureRecognizer:panGestureRecognizer];

#pragma mark --滑动空白区域收起键盘
-(void)handlePanGestures:(UIPanGestureRecognizer *)sender{

[self.view endEditing:YES];

}

####您最多还可以输入多个字的代理方法

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    NSString *temp = [textView.text stringByReplacingCharactersInRange:range withString:text];
    
    if (temp.length== 0) {
      //输入文字为0,提交按钮触摸事件隐藏
       [_submitBt setBackgroundColor:DMRGB(235, 235, 240)];
        [_submitBt setTitleColor:DMRGB(210, 210, 210) forState:UIControlStateNormal];
        _submitBt.userInteractionEnabled = NO;
        
    }
   else
    {

[_submitBt setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        _submitBt.backgroundColor = [UIColor colorWithRed:65.0/255 green:109.0/255 blue:218.0/255 alpha:1];
        _submitBt.userInteractionEnabled = YES;
    }
  
    NSString *str = [NSString stringWithFormat:@"%lu",100-temp.length];
    _mostLabel.attributedText =[self getString:[NSString stringWithFormat:@"您最多还可以输入%lu个字",100-temp.length] WithFontSize:DMFontSize14 WithTextColer:DMRGB(153, 153, 153) otherTextColer:DMRGB(237, 95, 95) WithRange:NSMakeRange(8,str.length)];

if (temp.length >= 100) {  //如果输入超过规定的字数100,就不再让输入
        return NO;
    }
    return YES;

}

-(NSMutableAttributedString*)getString:(NSString*)str  WithFontSize:(CGFloat)fontSize WithTextColer:(UIColor *)color  otherTextColer:(UIColor *)othercolor WithRange:(NSRange)strRange
{
    NSMutableAttributedString *attriString = [[NSMutableAttributedString alloc] initWithString:str];
    NSRange mainRange=NSMakeRange(0, str.length);
    [attriString setAttributes:  @{NSFontAttributeName: [UIFont systemFontOfSize:fontSize],
                                   NSForegroundColorAttributeName: color} range:mainRange];
    [attriString setAttributes:  @{NSFontAttributeName: [UIFont systemFontOfSize:fontSize],
                                   NSForegroundColorAttributeName: othercolor} range:strRange];
    return attriString;
    
}

本来以为解决了,结果测试发现了一个问题:当输入拼音的时候,那个提示语100并没有被减去。

百度了资料说:

这样在输入全部是英文的情况下是可以的. 但是当输入是中文时, 由于shouldChangeCharactersInRange判断的是当前键盘的字符数,最终采用了通知方法解决。

方法如下:

把那个shouldChangeCharactersInRange方法注释掉。代码如下:

- (void)initParameters
{
    [super initParameters];
    
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textViewChange) name:UITextViewTextDidChangeNotification object:nil];
    
    //关于输入拼音和英文状态下如何正确的统计输入的文字字数
 
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textViewEditChange:) name:UITextViewTextDidChangeNotification object:_feedbackTextView];
}

-(void)dealloc
{
    
    //    debugMethod();
    [[NSNotificationCenter defaultCenter]removeObserver:self name:UITextViewTextDidChangeNotification object:nil];
     [[NSNotificationCenter defaultCenter]removeObserver:self name:UITextViewTextDidChangeNotification object:_feedbackTextView];
    
}

#pragma mark 通知 方法

-(void)textViewChange
{
   
    
    if (_feedbackTextView.text.length== 0) {
        [_feedbackNoteLabel setHidden:NO];
 
    }else
    {
        [_feedbackNoteLabel setHidden:YES];
       
}
    
}

//关于输入拼音和英文状态下如何正确的统计输入的文字字数
-(void)textViewEditChange:(NSNotification *)obj{
 
    UITextView *textView = (UITextView *)obj.object;
    NSString *temp = textView.text;
    
    if (temp.length== 0) {
        
        [_submitBt setBackgroundColor:DMRGB(235, 235, 240)];
        [_submitBt setTitleColor:DMRGB(210, 210, 210) forState:UIControlStateNormal];
        _submitBt.userInteractionEnabled = NO;
        
    }
    else
    {
        [_submitBt setTitleColor:DMRGB(255, 255, 255) forState:UIControlStateNormal];
        _submitBt.backgroundColor = [UIColor colorWithRed:240.0/255 green:77.0/255 blue:77.0/255 alpha:1];
        _submitBt.userInteractionEnabled = YES;
    }
    
    NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage]; // 键盘输入模式
    if ([lang isEqualToString:@"zh-hans"]) { // 简体中文输入,包括简体拼音,健体五笔,简体手写
        
        NSString *str = [NSString stringWithFormat:@"%lu",100-temp.length];
        _mostLabel.attributedText =[self getString:[NSString stringWithFormat:@"您最多还可以输入%lu个字",100-temp.length] WithFontSize:DMFontSize14 WithTextColer:DMSecondaryTextColor otherTextColer:DMRGB(237, 95, 95) WithRange:NSMakeRange(8,str.length)];
        
        UITextRange *selectedRange = [textView markedTextRange];
        //获取高亮部分
        UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0];
        
        if (!position) {  //如果没有高亮选择的字,则对已经输入的文字进行字数统计和限制
            if (temp.length>100) {
                
              
               textView.text = [temp substringToIndex:100];
            }
        }
        else{  //有高亮选择的字,不对文字进行字数统计和限制
        
        }
     
}
    else{// 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
        
        NSString *str = [NSString stringWithFormat:@"%lu",100-temp.length];
        _mostLabel.attributedText =[self getString:[NSString stringWithFormat:@"您最多还可以输入%lu个字",100-temp.length] WithFontSize:DMFontSize14 WithTextColer:DMSecondaryTextColor otherTextColer:DMRGB(237, 95, 95) WithRange:NSMakeRange(8,str.length)];
    
   
        if (temp.length>100) {  //超过最大字符100,不让键盘输入
            
            textView.text = [temp substringToIndex:100];
        }
    }
   
}就可以了。

最后一步:关于emoji表情不能被输入,怎么解决?

如下:

#pragma mark - 代理   //用户完成编辑后所提示的事
-(void)textViewDidEndEditing:(UITextView *)textView{
        if ([self stringContainsEmoji:self.feedbackTextView.text]) {
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"不能带有表情符号,请输入中文" message:nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
            [alertView show];
        }
}
#pragma mark 判断NSString字符串是否包含emoji表情
- (BOOL)stringContainsEmoji:(NSString *)string{

__block BOOL returnValue = NO;
    
    [string enumerateSubstringsInRange:NSMakeRange(0, [string length])
                               options:NSStringEnumerationByComposedCharacterSequences
                            usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
                                const unichar hs = [substring characterAtIndex:0];
                                if (0xd800 <= hs && hs <= 0xdbff) {
                                    if (substring.length > 1) {
                                        const unichar ls = [substring characterAtIndex:1];
                                        const int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
                                        if (0x1d000 <= uc && uc <= 0x1f77f) {
                                            returnValue = YES;
                                        }
                                    }
                                } else if (substring.length > 1) {
                                    const unichar ls = [substring characterAtIndex:1];
                                    if (ls == 0x20e3) {
                                        returnValue = YES;
                                    }
                                } else {
                                    if (0x2100 <= hs && hs <= 0x27ff) {
                                        returnValue = YES;
                                    } else if (0x2B05 <= hs && hs <= 0x2b07) {
                                        returnValue = YES;
                                    } else if (0x2934 <= hs && hs <= 0x2935) {
                                        returnValue = YES;
                                    } else if (0x3297 <= hs && hs <= 0x3299) {
                                        returnValue = YES;
                                    } else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50) {
                                        returnValue = YES;
                                    }
                                }
                            }];
    
    return returnValue;

}

iOS-意见反馈UITextView的使用+不能输入字符输入的更多相关文章

  1. IOS开发之——意见反馈UITextView的使用+不能输入字符输入

    @interface DMFeedbackViewController ()<UITextViewDelegate,UIAlertViewDelegate>@property (nonat ...

  2. [ 中危 ] dp意见反馈处存储型XSS

    XSS平台架设攻击代码,有很多,如我是在http://xss.fbisb.com上架设的. 在 xxx.dianping.com系统意见反馈处插入xss代码提交,而后等待后台管理员点击,可打到其COO ...

  3. iOS 振动反馈

    代码地址如下:http://www.demodashi.com/demo/12461.html 1. 常用场景 继 iPhone7/7P 实体 home 键出现后,home 键再也无法通过真实的物理按 ...

  4. Win10《芒果TV》商店版更新v3.2.3:新增应用内意见反馈、播放重试、透明磁贴

    在2016圣诞节临近之际,<芒果TV>UWP版迅速更新v3.2.3版,主要是新增应用内意见反馈提交功能.播放重试.透明磁贴.动态磁贴等功能,进一步优化稳定性.视觉细节.运行速度. 芒果TV ...

  5. IOS开发之—— UITextView禁止Emoji输入

    UITextView代理方法:判断 -(void)textViewDidEndEditing:(UITextView *)textView{        if ([self stringContai ...

  6. ios开发之--textview意见反馈页面(占位label,字数统计,提交按钮的交互设置)

    记录一个页面的功能: textview的占位符,字数统计,提交按钮的交互设置,具体效果图如下:

  7. iOS 之UITextFiled/UITextView小结

    一:编辑被键盘遮挡的问题 参考自:http://blog.csdn.net/windkisshao/article/details/21398521 1.自定方法 ,用于移动视图 -(void)mov ...

  8. iOS开发之UITextView,设置textView的行间距及placeholder

    一.设置textView的行间距 1.如果只是静态显示textView的内容为设置的行间距,执行如下代码: //    textview 改变字体的行间距     NSMutableParagraph ...

  9. iOS开发之UITextView,设置textViewplaceholder

    一.设置textView的placeholder UITextView上如何加上类似于UITextField的placeholder呢,其实在UITextView上加上一个UILabel或者UITex ...

随机推荐

  1. Lua 学习之基础篇九<Lua 协同程序(Coroutine)>

    引言 讲到协程,首先来介绍一下线程和协程的区别 lua协程和多线程 相同之处:拥有自己独立的桟.局部变量和PC计数器,同时又与其他协程共享全局变量和其他大部分东西 不同之处:一个多线程程序可以同时运行 ...

  2. redis安装,以及开机自动启动

    tcl安装 # wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz# tar -xzvf tcl8.6.1-src.tar.gz ...

  3. 学习Python编程的最好的几本书

    读书是汲取某个特定学科的知识以及更深入的理解该学科的最好的方式.在这个科技世界,通晓计算机系统各个不同的技术领域是至关重要的.其中最重要的内容之一便是计算机程序语言.现今,计算机中存在许多不同类型的程 ...

  4. Java中String为什么是不可变

    什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的.不 ...

  5. 第一次的django 和html的插肩而过

    新建一个Python Django工程: Win+R进入cmd命令界面,并cd到指定工程目录下,比如我的工程目录是E:\wamp\Apache24\www\ 输入E: 跳转E盘 输入cd wamp\A ...

  6. ajax 页面无刷新

    <!-- 使用原生Ajax 和 $.ajax 实现局部刷新的过程 --><!-- 封装通用XMLHttpRequest对象 --><!DOCTYPE html>&l ...

  7. String.getBytes()方法中的中文编码问题(转)

    String的getBytes()方法是得到一个系统默认的编码格式的字节数组getBytes("utf-8")  得到一个UTF-8格式的字节数组 把String转换成bytes, ...

  8. 洛谷 P3382 【模板】三分法(三分 二分)

    P3382 [模板]三分法 题目提供者HansBug 难度 普及/提高- 题目描述 如题,给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减.试求出x的值. ...

  9. 关于VGA显示实验的问题

    今天做了一个关于VGA的显示实验,但是由于产生的25M时钟不正确所以一直没有图像产生.刚开始的程序如下 虽然仿真的时候出现了时序,但是在下载到硬件的时候不正确. 后来改成 结果就正确了. 另外之前关于 ...

  10. python3 操作ppt

    # pip install pywin32com# ppt太大会读取失败import win32com from win32com.client import Dispatch, constants ...