UITextFiled自動補全輸入,選中補全內容。NSRange和UITextRange的相互轉換。
阿新 • • 發佈:2019-02-08
有個需求就是 需要使用者輸入幾位以後賬號,可以根據本地儲存的登入成功的賬號,進行自動補全,並且補全內容為選中狀態,不影響使用者的新輸入。
研究了一下,下面是完整的實現的方法。
寫在 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];
}