有个需求就是 需要用户输入几位以后账号,可以根据本地存储的登录成功的账号,进行自动补全,并且补全内容为选中状态,不影响用户的新输入。

研究了一下,下面是完整的实现的方法。

补充个下载地址http://download.csdn.net/detail/darkmengqi/8426463

写在 textFiled的delegate里面,这样当有输入时会调用此方法。

  1. -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
  2. if ([string isEqualToString:@""]) {//删除的话
  3. return YES;
  4. }
  5. NSMutableString *text = [[NSMutableString alloc]initWithCapacity:0];
  6. [text appendString:textField.text];
  7. [text deleteCharactersInRange:range];//在选中的位置 插入string
  8. [text insertString:string atIndex:range.location];
  9. if (text.length>2) { // 限制从2个以上才开始匹配  根据需求 自己设定
  10. NSString *behind = [self matchString:text]; //匹配是否有开头相同的
  11. if (behind) {
  12. [text appendString:behind];
  13. textField.text = text;
  14. UITextPosition *endDocument = textField.endOfDocument;//获取 text的 尾部的 TextPositext
  15. //          选取尾部补全的String
  16. UITextPosition *end = [textField positionFromPosition:endDocument offset:0];
  17. UITextPosition *start = [textField positionFromPosition:end offset:-behind.length];//左-右+
  18. textField.selectedTextRange = [textField textRangeFromPosition:start toPosition:end];
  19. return NO;
  20. }else{
  21. return YES;
  22. }
  23. }
  24. return YES;
  25. }

顺便粘贴下 匹配字符的 代码,很简单。

  1. -(NSString *)matchString:(NSString *)head{
  2. for (int i = 0; i<[_array count]; i++) {
  3. NSString *string = _array[i];
  4. if ([string hasPrefix:head]) {
  5. return  [string substringFromIndex:head.length];
  6. }
  7. }
  8. return nil;
  9. }

这样就实现了一开始说的那个需求。

下面再说一下  光标的 一些问题。

获取光标的位置

UITextRange *selectedRange = [textField selectedTextRange];

根据NSRange 转换成 NSTextRange

  1. UITextPosition *beginning = textView.beginningOfDocument;
  2. UITextPosition *start = [textView positionFromPosition:beginning offset:range.location];
  3. UITextPosition *end = [textView positionFromPosition:start offset:range.length];
  4. nbsp;UITextRange *textRange = [textView textRangeFromPosition:start toPosition:end]];

   根据NSTextRange转换成 NSRange

    1. - (NSRange) selectedRange:(UITextField *)textField
    2. {
    3. UITextPosition* beginning = textField.beginningOfDocument;
    4. UITextRange* selectedRange = textField.selectedTextRange;
    5. UITextPosition* selectionStart = selectedRange.start;
    6. UITextPosition* selectionEnd = selectedRange.end;
    7. const NSInteger location = [textField offsetFromPosition:beginning toPosition:selectionStart];
    8. const NSInteger length = [textField offsetFromPosition:selectionStart toPosition:selectionEnd];
    9. }

UITextFiled自动补全输入,选中补全内容。NSRange和UITextRange的相互转换。-b的更多相关文章

  1. 2016/3/31 ①全选时 下面选项全选中 ② 下面不选中时 全选取消 ③在“” 中 转义字符的使用\ onclick=\"Checkpa(this,'flall')\"; ④区别于分别实现 重点在于两种情况合并实现

    testxuanbuxuan.php <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  2. RubyMine中自动完成只输入部分字母

    RubyMine中自动完成只输入部分字母 1,有下划线情况(其实看第二点跟下划线就关系不大了) 对于attr_reader之类的输入,输入attr之后,下划线可以不输入,然后输入r或者e都可以出来, ...

  3. bootstrap实现checkbox全选、取消全选

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <!-- 最新版本的 ...

  4. js全选与取消全选

    实现全选与取消全选的效果 要求1(将军影响士兵):点击全选按钮,下面的复选框全部选中,取消全选按钮,下面的复选框全部取消 思路:复选框是否被选中,取决于check属性,将全选按钮的check属性值赋值 ...

  5. Jquery实现checkbox全选、取消全选和反选

    最近在看廖雪峰的Jquery教程,事件篇的练习题比较综合,研究了很久终于研究出来了,现在分享出来,提供给小白学习.题目如下: 首先要获取到全选checkbox和每一项的checkbox,然后通过逻辑代 ...

  6. vue+el-table在ajax分页时支持全选单页和全选所有

    需求:el-table中,ajax分页的情况下,要支持全选单页和全选所有页中的记录,效果如下图所示: 界面代码:           <el-table :data="tableDat ...

  7. Silverlight 中DataGrid中全选与非全选问题

    问题:当点击全选时,全选所有的复选框,但是滚动屏幕时,却复选框就会取消选中 一.解决方法(将要展示的实体数据模型添加bool属性,在数据绑定时添加click时间,盘带选中的状态,就可以了) 1. xa ...

  8. jQuery --checkbox全选和取消全选简洁高效的解决办法

    最近在公司做了一个小项目,其中有一个全选和取消全选的这么一个模块,搞了半天找不到一种最佳的解决方案!后来通过各种努力找到了一种简洁高效的解决办法,这里想和大家分享一下.有问题的话,还望各路大神指导一二 ...

  9. bootgrid修改成可以全勾选和全取消勾选操作

    1. 引言 由于项目需要,需要在不同页面上选择全勾选能全部勾选所有的记录,反勾选也如此.这个需求可以解决了一个样例:如果有150条记录,当前页就10条,你又在每一个页面勾选部分的记录,然后,如果你要全 ...

随机推荐

  1. [置顶] [混迹IT职场系列]一、转正的那些事儿

    讲起转正,是每个IT人进入职场后要面对的第一关,只有越过这第一关卡才能更加顺利玩弄职场或被职场玩弄或互相玩弄. 很多人觉得转正只需自身努力即可,譬如有句话叫做 “只要功夫深,铁针磨成棒”.其实不然,职 ...

  2. [置顶] Ubuntu 12.04以上如何恢复GNOME传统界面

    Ubuntu 12.04以上开始使用Unity作为界面系统了,对于一直以来使用GNOME界面的人来说太不适应了,以下是如何在Ubuntu 12.04上恢复GNOME桌面 打开Linux终端上输入以下命 ...

  3. composer安装第三方库

    生成composer.json 首先需要安装composer,composer -v出现如下,则表明安装成功. 编写composer.json { "name": "ww ...

  4. 第1章 Python基础之字符编码

    阅读目录 一.什么是字符编码 二.字符编码分类 三.字符编码转换关系 3.1 程序运行原理 3.2 终极揭秘 3.3 补充 总结 回到顶部 一.什么是字符编码 计算机要想工作必须通电,也就是说'电'驱 ...

  5. 【JavaScript】我的JavaScript技术总结第一篇——编程细节

    遍历数组 for (var i=0, l=arr.length; i<l; i++) 这样写的一个好处就是让每次循环少一步获取数组对象长度的操作,数组长度越长,价值越明显. 判断变量的真假 if ...

  6. [转] linux之sed用法

    sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为:         sed ...

  7. GDataXML的配置和使用

    1.下载链接:http://code.google.com/p/gdata-objectivec-client/downloads/list下载“gdata-objective-c client li ...

  8. Android(java)学习笔记234: 服务(service)之音乐播放器

    1.我们播放音乐,希望在后台长期运行,不希望因为内存不足等等原因,从而导致被gc回收,音乐播放终止,所以我们这里使用服务Service创建一个音乐播放器. 2.创建一个音乐播放器项目(使用服务) (1 ...

  9. 解决Ubuntu 14.04 下SMPlayer的字幕乱码问题

    1.SMPlayer播放器 对于使用ubuntu系统的同学,虽然系统初始就带有vedio播放器,但是这里强烈推荐SMPlayer,直接在Ubuntu Software Center中就可以免费下载安装 ...

  10. C#-高血压生活习惯数据模拟

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace test ...