1. 程式人生 > >UITextFiled自動補全輸入,選中補全內容。NSRange和UITextRange的相互轉換。

UITextFiled自動補全輸入,選中補全內容。NSRange和UITextRange的相互轉換。

       有個需求就是 需要使用者輸入幾位以後賬號,可以根據本地儲存的登入成功的賬號,進行自動補全,並且補全內容為選中狀態,不影響使用者的新輸入。

       研究了一下,下面是完整的實現的方法。

      寫在 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];
  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];
}