Ios 自动完成UITextField

Ios 自动完成UITextField,ios,objective-c,cocoa-touch,Ios,Objective C,Cocoa Touch,我想从自定义值自动完成文本字段 在这里研究过谷歌等等 我试过这个: - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if ([string isEqualToString:@"Fac"]) { _clientField.text = @"Factory"; }

我想从自定义值自动完成文本字段

在这里研究过谷歌等等

我试过这个:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    if ([string isEqualToString:@"Fac"]) {
        _clientField.text = @"Factory";
    }

    return YES;
}
问题是我没有输入任何预测值
Factory
,只有输入的值
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;
}

仍然是相同的

您应该尝试
NSLog
字符串
它总是返回用户输入的最后一个字符(除非复制/粘贴字符串:在这种情况下,您的代码有效)

实际上,做你想做的事情并不像看上去那么简单。 我想到的是:

- (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;
}  
如果您不自己构建nextText,那么自动完成将被延迟。例如,如果您只检查textField.text的值,并键入“Fac”,则在下一个字符输入时将完成此操作。
当您自动完成字段时,还必须返回NO,这样
字符串就不会添加到文本字段的末尾(F->Fa->Factoryc,您不希望这样)。所以你说textField不应该改变范围内的字符。。。您可以自己更改textField值


希望这将有助于您了解此
UITextFieldDelegate
方法中的情况。

我检查了您的示例代码,但未设置文本字段的委托

您可以使用在视图控制器中设置它

_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将完成这项工作:


基本上,您只需要给它一个值数组作为自动完成数据源,它将在用户键入时在文本字段中提供建议。

您还可以查看此控件()。在给定链接中的示例源代码中,您将看到搜索列表过滤器作为用户类型

nAutoCompleteTextField
易于集成:

#import "NHMainHeader.h"

autoCompleteTextField = [[NHAutoCompleteTextField alloc] initWithFrame:CGRectMake(x, y, width, 18)];  // 18 - example height
[autoCompleteTextField setDropDownDirection:NHDropDownDirectionDown];
[autoCompleteTextField setDataSourceDelegate:self];
[autoCompleteTextField setDataFilterDelegate:self];
并可根据您的需要灵活定制。例如,根据需要在此处创建单元格:

- (UITableViewCell *)autoCompleteTextBox:(NHAutoCompleteTextField *)autoCompleteTextBox cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

}
可根据给定的下拉方向进行调整

typedef enum
{
    NHDropDownDirectionUp,
    NHDropDownDirectionDown

} NHDropDownDirection;
该控件还提供了一些很好的扩展功能,这将有助于处理其他UI

#import "UIView+NHExtension.h"
#import "UILabel+Boldify.h"

仅仅附加字符串是不正确的,因为用户可能会在不同的位置插入字符。您需要替换字符串中的给定范围。@frenetischapplaudierend您是对的。我没想过。用退格删除时它不起作用。这使得无法从文本字段中删除Factory您是对的@Tom。为了正确地执行操作,您应该明确地使用这个方法(),而不是简单地附加字符串。您还应该检查空字符串以正确处理删除。您还需要了解范围在不同用例中的行为,例如追加、删除、粘贴、插入、选择和替换。我认为删除时接受的答案也不起作用。正确地执行自动完成需要更多的代码,而这种委托方法行为可能很难理解。我的回答是为了证明返回“否”可以让您自己控制文本替换。谢谢!,这件事已经纠缠了很久了!终于分类了!