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

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

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

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

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

[objc] view plain copy

  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. }

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

[objc] view plain copy

  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

[objc] view plain copy

  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

[objc] view plain copy

    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. }
时间: 2024-10-12 15:37:51

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

自动补全,前置位补0

/** * 自动补全,前置位补0 * 使用场景: 获取时间,小于10前面补0等 * @param {String} str 要补全的字符 * @param {number} len 要补全的长度 * @return {String} */ function lenFormat(str, len) { if (len <= 0 || isNaN(len)) { console.error("传入参数格式错误,长度必须为数字,且不能小于1"); return str; } var b

关于列表中checkbox选中,全选/反选设置

关于列表中checkbox选中,全选设置 1 <html> 2 <head> 3 <script type="text/javascript"> 4 //点击行时,checkbox处理方法 5 function doclick(id){ 6 var allche = document.getElementById("allid");//全选checkbox 7 var che = document.getElementsByNam

jQuery实现checkbox(复选框)选中、全选反选代码

谁都知道 在html 如果一个复选框被选中 是 checked="checked". 但是我们如果用jquery alert($("#id").attr("checked")) 会提示您是true而不是checked 所以很多朋友判断  if($("#id").attr("checked")=="true") 这个是错误的,其实应该是 if($("#id").attr

Axure 7.0实现复选框全选和取消全选

使用Axure原型工具对产品进行设计,使用复选框来实现全选中和全取消效果,也可以利用按钮或文字做为开关来控制效果,下面主要介绍使用复选框来实现全选中和全取消效果. 1/1 首先输入复选框效果的文字,并为每个复选框建立名称,方便后期对其辨认,例如:选择你最喜欢居住的城市,建立一个全选的复选框进行全选or取消全选效果 1/2 设置全选中 1/2/1 选择全选复选框,双击(选中状态改变时),打开新增用例对话框 1/2/2  设置用例名称,设置条件判断为真 1/2/3 选择(选中),勾选需要被选中的复选

JavaScript全选和取消全选

<html> <head> <title>全选和取消全选</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script language="javascript"> function checkAllorcancelAll(){ //思路:1.获取checkbox的选中状

实现全选和取消全选

点击“全选老大”实现全选,再次点击取消全选,以此类推. html代码是不变的: <div id="mycheckbox"> <input type="checkbox" id="selectAll"><br> <input type="checkbox"><br> <input type="checkbox"><br> &l

如何实现复选框的全选和取消全选效果

如何实现复选框的全选和取消全选效果:在很多网站都有这样的功能,当点击一个全选按钮之后,所有的复选框都会被选中,再点击之后会取消全选,功能非常的人性化,可以省却很多人力,下面就简单介绍一下JS如何实现此功能,代码实例如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://ww

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

1. 引言 由于项目需要,需要在不同页面上选择全勾选能全部勾选所有的记录,反勾选也如此.这个需求可以解决了一个样例:如果有150条记录,当前页就10条,你又在每一个页面勾选部分的记录,然后,如果你要全部全选,需要在每一个页面上勾上全选checkbox,全部反选也有这个问题. 2.修改的代码 基于jQuery Bootgrid v1.3.1这个版本. bootgrid.js修改的部分如下: //原有的select和deselect方法 /** * Selects rows by ids. Sele

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

最近在公司做了一个小项目,其中有一个全选和取消全选的这么一个模块,搞了半天找不到一种最佳的解决方案!后来通过各种努力找到了一种简洁高效的解决办法,这里想和大家分享一下.有问题的话,还望各路大神指导一二. html代码如下: <fieldset data-role="controlgroup">  <label><input type="checkbox" name="boxes" id="select_al