UITextFiled自动补全输入,选中补全内容。NSRange和UITextRange的相互转换。-b
有个需求就是 需要用户输入几位以后账号,可以根据本地存储的登录成功的账号,进行自动补全,并且补全内容为选中状态,不影响用户的新输入。
研究了一下,下面是完整的实现的方法。
补充个下载地址http://download.csdn.net/detail/darkmengqi/8426463
写在 textFiled的delegate里面,这样当有输入时会调用此方法。
- -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
- if ([string isEqualToString:@""]) {//删除的话
- return YES;
- }
- NSMutableString *text = [[NSMutableString alloc]initWithCapacity:0];
- [text appendString:textField.text];
- [text deleteCharactersInRange:range];//在选中的位置 插入string
- [text insertString:string atIndex:range.location];
- if (text.length>2) { // 限制从2个以上才开始匹配 根据需求 自己设定
- NSString *behind = [self matchString:text]; //匹配是否有开头相同的
- if (behind) {
- [text appendString:behind];
- textField.text = text;
- UITextPosition *endDocument = textField.endOfDocument;//获取 text的 尾部的 TextPositext
- // 选取尾部补全的String
- UITextPosition *end = [textField positionFromPosition:endDocument offset:0];
- UITextPosition *start = [textField positionFromPosition:end offset:-behind.length];//左-右+
- textField.selectedTextRange = [textField textRangeFromPosition:start toPosition:end];
- return NO;
- }else{
- return YES;
- }
- }
- return YES;
- }
顺便粘贴下 匹配字符的 代码,很简单。
- -(NSString *)matchString:(NSString *)head{
- for (int i = 0; i<[_array count]; i++) {
- NSString *string = _array[i];
- if ([string hasPrefix:head]) {
- return [string substringFromIndex:head.length];
- }
- }
- return nil;
- }
这样就实现了一开始说的那个需求。
下面再说一下 光标的 一些问题。
获取光标的位置
UITextRange *selectedRange = [textField selectedTextRange];
根据NSRange 转换成 NSTextRange
- UITextPosition *beginning = textView.beginningOfDocument;
- UITextPosition *start = [textView positionFromPosition:beginning offset:range.location];
- UITextPosition *end = [textView positionFromPosition:start offset:range.length];
- nbsp;UITextRange *textRange = [textView textRangeFromPosition:start toPosition:end]];
根据NSTextRange转换成 NSRange
- - (NSRange) selectedRange:(UITextField *)textField
- {
- UITextPosition* beginning = textField.beginningOfDocument;
- UITextRange* selectedRange = textField.selectedTextRange;
- UITextPosition* selectionStart = selectedRange.start;
- UITextPosition* selectionEnd = selectedRange.end;
- const NSInteger location = [textField offsetFromPosition:beginning toPosition:selectionStart];
- const NSInteger length = [textField offsetFromPosition:selectionStart toPosition:selectionEnd];
- }
UITextFiled自动补全输入,选中补全内容。NSRange和UITextRange的相互转换。-b的更多相关文章
- 2016/3/31 ①全选时 下面选项全选中 ② 下面不选中时 全选取消 ③在“” 中 转义字符的使用\ onclick=\"Checkpa(this,'flall')\"; ④区别于分别实现 重点在于两种情况合并实现
testxuanbuxuan.php <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- RubyMine中自动完成只输入部分字母
RubyMine中自动完成只输入部分字母 1,有下划线情况(其实看第二点跟下划线就关系不大了) 对于attr_reader之类的输入,输入attr之后,下划线可以不输入,然后输入r或者e都可以出来, ...
- bootstrap实现checkbox全选、取消全选
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <!-- 最新版本的 ...
- js全选与取消全选
实现全选与取消全选的效果 要求1(将军影响士兵):点击全选按钮,下面的复选框全部选中,取消全选按钮,下面的复选框全部取消 思路:复选框是否被选中,取决于check属性,将全选按钮的check属性值赋值 ...
- Jquery实现checkbox全选、取消全选和反选
最近在看廖雪峰的Jquery教程,事件篇的练习题比较综合,研究了很久终于研究出来了,现在分享出来,提供给小白学习.题目如下: 首先要获取到全选checkbox和每一项的checkbox,然后通过逻辑代 ...
- vue+el-table在ajax分页时支持全选单页和全选所有
需求:el-table中,ajax分页的情况下,要支持全选单页和全选所有页中的记录,效果如下图所示: 界面代码: <el-table :data="tableDat ...
- Silverlight 中DataGrid中全选与非全选问题
问题:当点击全选时,全选所有的复选框,但是滚动屏幕时,却复选框就会取消选中 一.解决方法(将要展示的实体数据模型添加bool属性,在数据绑定时添加click时间,盘带选中的状态,就可以了) 1. xa ...
- jQuery --checkbox全选和取消全选简洁高效的解决办法
最近在公司做了一个小项目,其中有一个全选和取消全选的这么一个模块,搞了半天找不到一种最佳的解决方案!后来通过各种努力找到了一种简洁高效的解决办法,这里想和大家分享一下.有问题的话,还望各路大神指导一二 ...
- bootgrid修改成可以全勾选和全取消勾选操作
1. 引言 由于项目需要,需要在不同页面上选择全勾选能全部勾选所有的记录,反勾选也如此.这个需求可以解决了一个样例:如果有150条记录,当前页就10条,你又在每一个页面勾选部分的记录,然后,如果你要全 ...
随机推荐
- centos 5 yum安装与配置vsFTPd FTP服务器
vsftpd作为FTP服务器,在Linux系统中是非常常用的.下面我们介绍如何在centos系统上安装vsftp. 什么是vsftpd vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序 ...
- Oulipo - HDU 1686 (KMP模板题)
题目大意:题目叙述很多,其实只看输入输出也能明白什么意思,给两个串W,T, 判断T串中包含几个串W. 分析:还是基础的KMP应用....................... 直接上代码. === ...
- poj1019
有一个序列 1 12 123 1234 ..... ........ ........... 12345678910 ................................ 求第n个数字是什 ...
- Mysql Binlog日志详解
一.Mysql Binlog格式介绍 Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的sql都会记录在 ...
- Sublime编辑器 前端 必备插件
sublime编辑器前端必备插件 下面这一行是Package Control包安装,它是sublime的插件包管理器.新安装的sublime 里没有Package Control,按一下ctrl+~, ...
- mysql 更新有外键约束的字段
给一个表的字段更新,发现 这个字段是外键,刚开始用了笨 的方法,取消外键,修改后,在添加, 网上百度了. 这样设置 先 关闭外键约束 SET FOREIGN_KEY_CHECKS=0; 执行完了 打开 ...
- Mongodb快速入门之使用Java操作Mongodb
[IT168 专稿]在上一篇文章中,我们学习了Mongodb的安装和初步使用,在本文中,将学习如何使用Java去编程实现对Mongodb的操作. HelloWorld程序 学习任何程序的第一步,都是编 ...
- Eclipse debug经常使用基本技巧
1.F5单步调试,步入,进入函数体内部 2.F6单步调试.步过.不进入函数体 3.F7返回 4.F8运行到最后 5.退出时.右键点击右上角Debug选择退出就可以 $(function () { $( ...
- 论C++与三国
Scott Meyers曾说过,C++语言是一个语言联邦.C++包含面向过程,面向对象,泛型编程编程思想.现在C++11有加了一堆新特性,语言联邦更为庞大. 程序员们.常常挑起语言之争,甚至连大师级人 ...
- 你好,C++(12)怎样管理多个类型同样性质同样的数据?3.6 数组
3.6 数组 学过前面的基本数据类型之后,我们如今能够定义单个变量来表示单个的数据.比如,我们能够用int类型定义变量来表示公交车的216路:能够用float类型定义变量来表示西红柿3.5元一斤. ...