@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. iOS开发-带Placeholder的UITextView实现

    iOS中UITextField带有PlaceHolder属性,可以方便用于提示输入.但是同样可以进行文本输入的UITextView控件则没有PlaceHolder属性,还是有些不方便的,尤其是对于略带 ...

  3. iOS 开发App捕获异常, 反馈给服务器, 提高用户体验

    在我们开发的app中, 不可避免的, 有时候用户使用软件会崩溃.  我们就需要捕获异常, 可以在入口类中加入相应的代码, 可以在每次用户打开程序的时候, 检查一下沙盒中是否有崩溃日志, 如果有, 可以 ...

  4. iOS开发笔记12:iOS7上UITextField限制字数输入导致崩溃问题

    在一些场景中,需要限制用户的输入字数,例如在textField里进行控制(textView也类似,崩溃原因也相同),如图所示 系统会监听文本输入,需要注意的第一点是输入法处于联想输入还未确定提交的时候 ...

  5. iOS开发笔记7:Text、UI交互细节、两个动画效果等

    Text主要总结UILabel.UITextField.UITextView.UIMenuController以及UIWebView/WKWebView相关的一些问题. UI细节主要总结界面交互开发中 ...

  6. 《iOS开发指南》正式出版-源码-样章-目录,欢迎大家提出宝贵意见

    智捷iOS课堂-关东升老师最新作品:<iOS开发指南-从0基础到AppStore上线>正式出版了 iOS架构设计.iOS性能优化.iOS测试驱动.iOS调试.iOS团队协作版本控制.... ...

  7. 《iOS开发指南》要改iOS8版本了,听听您的意见?

    <iOS开发指南>要改iOS8版本了,听听您的意见?参加问卷同学均可获得智捷课堂50元代金卡一张,同时抽取一名同学赠送即将出版的基于iOS8的<iOS开发指南>一本,欢迎大家填 ...

  8. iOS开发-UITextView根据内容自适应高度

    UITextView作为内容文本输入区域,有的时候我们需要根据内容动态改变文本区域的高度,效果如下: 定义UITextView,实现UITextViewDelegate: -(UITextView * ...

  9. iOS:iOS开发非常全的三方库、插件等等

    iOS开发非常全的三方库.插件等等 github排名:https://github.com/trending, github搜索:https://github.com/search. 此文章转自git ...

随机推荐

  1. 阿里云ECS服务器(ubuntu)下基本配置以及升级git

    最近需要在阿里云服务器上远程搭建调试环境,这里把遇到的问题做一下记录: 1.ECS Linux解决SSH会话连接超时问题 用SSH客户端(我使用的Xshell)连接linux服务器时,经常会出现与服务 ...

  2. Effective Java 35 Prefer annotations to naming patterns

    Disadvantages of naming patterns Typographical errors may result in silent failures. There is no way ...

  3. 方程ax2+bx+c=0;一元二次方程。求根

    <body>方程ax2+bx+c=0;一元二次方程.求根请输入a:<input type="number" id="a"/><br ...

  4. 《SQL Server企业级平台管理实践》读书笔记——SQL Server中收缩数据库不好用的原因

    数据库管理员有时候需要控制文件的大小,可能选择收缩文件,或者把某些数据文件情况以便从数据库里删除. 这时候我们就要使用到DBCC SHRINKFILE命令,此命令的脚本为: DBCC SHRINKFI ...

  5. 【mysql】索引的优化

    写在前面的话 查询容易,优化不易,且写且珍惜 mysql结构 从MySQL逻辑架构来看,MySQL有三层架构,第一层连接,第二层查询解析.分析.优化.视图.缓存,第三层,存储引擎 MySQL有哪些索引 ...

  6. mac环境下手动卸载mysql

    1.sudo rm /usr/local/mysql 2.sudo rm -rf /usr/local/mysql* 3.sudo rm -rf /Library/StartupItems/MySQL ...

  7. MFC 窗口分割

    动态分割窗口: BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { , , CSize(, ...

  8. 新手在sae部署程序容易忽略的一个细节

    从来没用过这类云空间服务,尝了下鲜试用一下sae,但是部署的时候发现问题了,各种404..各种无奈啊..虽然百度无数篇介绍,但是都千篇一律没什么启发.. 但是巧在我部署的应用有个欢迎页面,点击链接的时 ...

  9. lvs realserver 配置VIP

    # $# 表示提供到shell脚本或者函数的参数总数: # 1表示只有一个参数. #/bin/bash #file: tun_RS.sh if [ $# -ne 1 ]; then echo “usa ...

  10. B+树的特点

    1.B+树是应文件系统产生的B树的变种.它依然是一颗多路查找树,与B树相比它的不同体现在: (1).如果非叶子节点包含n个关键码,则这个节点有n个子树. (2).非叶子节点仅包含关键码信息,叶子节点包 ...