需求描述

1. 发布信息时,通过键盘键入@符号,或者点选相关功能键,唤醒@列表,进行选择

2.选择结束后,输入栏改色显示相关内容

3.删除时,整体删除@区块,且不能让光标落在@区块之间

实现步骤

1. 键入@符号,触发相关功能

 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
//判断键入的字符
if ([text isEqualToString:@"@"]) {
//触发相关功能
//[self pickRemaidBtnClick];
return NO;
} return YES;
}

2. @区块颜色修改

(1)使用到的正则表达式

#define kATRegular @"@[\\u4e00-\\u9fa5\\w\\-\\_]+ "

(2)获取匹配到的区块下标数组

+ (NSArray *) getMatchsWithStr : (NSString *) text {
// 找到文本中所有的@
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:kATRegular options:NSRegularExpressionCaseInsensitive error:nil];
NSArray *matches = [regex matchesInString:text options:NSMatchingReportProgress range:NSMakeRange(, [text length])];
return matches;
}

(3)修改文本颜色

-(void)textViewDidChange:(UITextView *)textView {
NSArray *matchs = [RemaidUserUtils getMatchsWithStr:textView.text];
//改色
[textView.textStorage addAttribute:NSForegroundColorAttributeName value:[UIColor colorWithHexString:@"#333333"] range:NSMakeRange(, textView.text.length)];
for (NSTextCheckingResult *match in matchs)
{
[textView.textStorage addAttribute:NSForegroundColorAttributeName value:BLUECOLOR range:NSMakeRange(match.range.location, match.range.length - )];
}
}

3.删除时整体删除@区块

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{

    if ([text isEqualToString:@""])
{
NSRange selectRange = textView.selectedRange;
if (selectRange.length > )
{
//用户长按选择文本时不处理
return YES;
} // 判断删除的是一个@中间的字符就整体删除
NSMutableString *string = [NSMutableString stringWithString:textView.text];
NSArray *matches = [RemaidUserUtils getMatchsWithStr:string]; BOOL inAt = NO;
NSInteger index = range.location;
for (NSTextCheckingResult *match in matches)
{
NSRange newRange = NSMakeRange(match.range.location + , match.range.length - );
if (NSLocationInRange(range.location, newRange))
{
inAt = YES;
index = match.range.location;
[textView.textStorage replaceCharactersInRange:match.range withString:@""];
textView.selectedRange = NSMakeRange(index, );
[self textViewDidChange:textView];
return NO;
break;
}
}
} return YES;
}

4.不允许光标落在@区块之间

- (void)textViewDidChangeSelection:(UITextView *)textView {
// 光标不能点落在@词中间
NSRange range = textView.selectedRange;
if (range.length > )
{
// 选择文本时可以
return;
} NSArray *matches = [RemaidUserUtils getMatchsWithStr:textView.text]; for (NSTextCheckingResult *match in matches)
{
NSRange newRange = NSMakeRange(match.range.location + , match.range.length - );
if (NSLocationInRange(range.location, newRange))
{
if (range.location == match.range.location + ) {
textView.selectedRange = NSMakeRange(match.range.location + match.range.length, );
} else {
textView.selectedRange = NSMakeRange(match.range.location , );
}
break;
}
}
}

BY: chu

iOS @功能的部分实现思路的更多相关文章

  1. Unity iOS混合开发界面切换思路

    Unity iOS混合开发界面切换思路 最近有很多博友QQ 私信 或则 留言联系我,请教iOS和Unity界面之前相互切换的问题,源代码就不私下发你们了,界面跳转功能的代码我直接贴到下面好了,顺带说i ...

  2. 多文件上传 iOS功能

    多文件上传 iOS功能,原文来自ios教程网整理的,大家可以看看演示:ios.662p.com ,喜欢的朋友可以看看我的博客吧. NSURL* url = [NSURL URLWithString:@ ...

  3. 李洪强iOS开发-网络新闻获取数据思路回顾

    李洪强iOS开发-网络新闻获取数据思路回顾 01 创建一个继承自AFHTTPSessionManager的工具类:LHQNetworkTool 用来发送网络请求获取数据  1.1 定义类方法返回单例对 ...

  4. iOS 组件化 —— 路由设计思路分析

    原文 前言 随着用户的需求越来越多,对App的用户体验也变的要求越来越高.为了更好的应对各种需求,开发人员从软件工程的角度,将App架构由原来简单的MVC变成MVVM,VIPER等复杂架构.更换适合业 ...

  5. 怎么样才是设计功能函数的好思路(javascript)?

    在js里面,对于函数的调用,实际上也是也是面向对象的思路,于是写好js函数,也是考核面向对象设计的能力,同时也必须考虑到如何实现高内聚和低耦合,拿一个例子来说,现在的需求是这样的,实现个投资进度框,就 ...

  6. iOS逆向系列-逆向APP思路

    界面分析 通过Cycript.Reveal. 对于Reveal安装配置可参考配置iOS逆向系列-Reveal 通过Reveal找到内存中的UI对象 静态分析 开发者编写的所有代码最终编译链接到Mach ...

  7. 【iOS功能实现】之利用UIDocumentInteractionController打开和预览文档

    iOS提供了使用其他app预览文件的支持,这就是Document Interaction Controller.此外,iOS也支持文件关联,允许其他程序调用你的app打开某种文件.而且,从4.2开始, ...

  8. 关于 iOS 刷新效果实现的思路 和 mac软件网址推荐

    有一次面试,突然有个人问了我一个问题:MJRefresh的原理是什么? 我说这种效果可以有两种方法实现: 1.  UIRefreshControl 2.  通过监听scrollview的偏移量,自定义 ...

  9. 实现ios常见菜单效果的思路

    眼下见过的实现边側菜单的效果.比較流行的有下面三种:(效果图) 1.菜单条覆盖在部分主视图上 附上实现该效果的一个不错的源代码地址: http://code4app.com/ios/RNFrosted ...

随机推荐

  1. danci4

    advantage 英 [əd'vɑːntɪdʒ] 美 [əd'væntɪdʒ] n. 优势:利益:有利条件 vi. 获利 vt. 有利于:使处于优势 lack 英 [læk] 美 [læk] vt. ...

  2. 了解一下Elasticsearch的基本概念

    一.前文介绍 Elasticsearch(简称ES)是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Lucene 可以被认为是迄今为止最先进.性能最好的.功能最全的 ...

  3. robot framework设置更高级别的关键字

    robot framework中除了内置的关键字,以及低级别的用户自定义关键字外,为了使用例更加整洁,我们还可以形成更高级别的关键字 方法如下: 在Keywords里面设置 其中Run Success ...

  4. 自用 goodsdetail

    JSON.parse(data.parameter)  存的字符串 <select id="getGoodsBaseInfoById" resultType="co ...

  5. RSDS pdb格式

    本描述了“RSDS”或“DS”类型的pdb(程序数据库)文件的格式,这些文件是由Miscrosoft的link.exe从版本7及更高版本发出的. 什么是PDB文件? 如果选择了/DEBUG选项或/DE ...

  6. 同期群分析(Cohort Analysis)

    什么是同期群? 将相同时间段内具有共同行为特征的用户划分为同一个群体,其被称为同期群.“共同行为特征”是指在某个时间段内的行为相似.最常见的是按不同时间的新增用户来划分,然后分析留存率.当然也可以按其 ...

  7. centos6 启动docker报错

    1.启动docker报错: # service docker stop Stopping docker: [ OK ] [root@RSING data2]# service docker start ...

  8. Freemarker的简单demo

    第一步.导入依赖 <dependency> <groupId>org.freemarker</groupId> <artifactId>freemark ...

  9. [学习笔记] kd-tree

    本文参考这位dalao的题解 前置技能:二叉查找树 其实kd-tree很简单的啦 和BST都差不多的啦 就是在划分的时候把每一维都比较一下就行啦 (\(dalao\)的kd-tree教程) 然而本蒟蒻 ...

  10. ueditor div style被过滤 解决办法

    上周开发中有用到开源的富文本编辑器UEditor,在使用的过程中遇到了样式被过滤无法显示问题,经过一番折腾终解决,此外,还有一些关于获取前台界面元素的一些总结. 1. UEditor样式被过滤无法显示 ...