自动完成UITextField
我想自动从自定义值中完成文本字段
在这里研究了Google和SO UITextField Autocomplete – iPhone SDK
我试过这个:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if ([string isEqualToString:@"Fac"]) { _clientField.text = @"Factory"; } return YES; }
问题是我没有得到预测值inputFactory
,只是键入的值Fac
编辑
试图根据答案…
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if ([string isEqualToString:@"Fac"]) { _clientField.text = [_clientField.text stringByReplacingCharactersInRange:range withString:@"Factory"]; } return NO; }
还是一样
我检查了您的示例代码,并没有设置文本字段的代表。
你可以在你的视图控制器中使用
_clientField.delegate = self;
此外,您需要使用稍微不同的方法来获取用户看到的文本。 像这样的东西:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSString *currentString = [textField.text stringByReplacingCharactersInRange:range withString:string]; if ([currentString isEqualToString:@"Fac"]) { textField.text = @"Factory"; return NO; } return YES; }
请注意,您可能需要对此进行微调,因为它也会在用户删除文本时自动完成。 但是这应该让你走上正轨。
听起来像HTAutocompleteTextField将完成这项工作:
https://github.com/hoteltonight/HTAutocompleteTextField
你基本上只需要给它一个值作为自动完成数据源的数组,它会使文本字段中的build议作为用户types。
你应该尝试NSLog
string
它总是返回用户input的最后一个字符(除非你复制/粘贴一个string:在这种情况下,你的代码工作)。
其实,做你正在做的事情并不像看起来那么简单。 在这里,我想出了:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSLog(@"string: %@", string); NSString *currentText = textField.text; NSString *nextText = [currentText stringByAppendingString:string]; if ([nextText isEqualToString:@"Fac"]) { textField.text = @"Factory"; return NO; } return YES; }
如果你不自己构buildnextText,那么自动完成将被延迟。 如果您只检查textField.text的值,并且键入“Fac”,则在下一个字符input时将会发生完成。
当你自动填充字段时,你必须返回NO,所以string
不会被添加到文本字段的末尾(F – > Fa – > Factoryc,你不需要)。 所以你说textField不应该改变范围内的字符…而你自己改变textField的值。
希望这会帮助你理解这个UITextFieldDelegate
方法中发生了什么。
你也可以看看这个控件( NHAutoCompleteTextField )。 在给定链接的示例源代码中,您将看到search列表filter作为用户types。
NHAutoCompleteTextField
易于集成:
#import "NHMainHeader.h" autoCompleteTextField = [[NHAutoCompleteTextField alloc] initWithFrame:CGRectMake(x, y, width, 18)]; // 18 - example height [autoCompleteTextField setDropDownDirection:NHDropDownDirectionDown]; [autoCompleteTextField setDataSourceDelegate:self]; [autoCompleteTextField setDataFilterDelegate:self];
并根据您的需要灵活定制。 例如,根据您的需要在这里创build单元格:
- (UITableViewCell *)autoCompleteTextBox:(NHAutoCompleteTextField *)autoCompleteTextBox cellForRowAtIndexPath:(NSIndexPath *)indexPath { }
对于给定的下拉方向可以调整。
typedef enum { NHDropDownDirectionUp, NHDropDownDirectionDown } NHDropDownDirection;
这个控件还提供了一些很好的扩展function,这将有助于处理其他用户界面。
#import "UIView+NHExtension.h" #import "UILabel+Boldify.h"