2

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

在这里研究了 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;
}

问题是我没有输入预测值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;
}

还是一样

4

4 回答 4

7

听起来像 HTAutocompleteTextField 会做这项工作:

https://github.com/hoteltonight/HTAutocompleteTextField

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

于 2013-01-25T20:34:40.670 回答
2

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

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

_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;
}

请注意,您可能希望对此进行微调,因为它还会在用户删除文本时自动完成。但这应该让你走上正轨。

于 2013-01-18T10:35:26.850 回答
2

您应该尝试NSLog 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;
}  

如果您不自己构建 nextText,那么自动完成将被延迟。例如,如果您只检查 textField.text 的值,并且您键入“Fac”,则完成将在下一个字符输入时发生。
当您自动完成该字段时,您还必须返回 NO,因此string不会在文本字段的末尾添加(F -> Fa -> Factoryc,您不希望这样)。所以你说 textField 不应该改变范围内的字符......你自己改变了 textField 的值。

希望这将帮助您了解此UITextFieldDelegate方法中发生的情况。

于 2013-01-17T21:58:10.100 回答
1

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

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];

并灵活地根据您的需要进行定制。例如,根据您的需要在这里创建单元格:

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

}

可针对给定的下拉方向进行调整。

typedef enum
{
    NHDropDownDirectionUp,
    NHDropDownDirectionDown

} NHDropDownDirection;

此控件还提供了一些很好的扩展功能,这些功能也有助于处理其他 UI。

#import "UIView+NHExtension.h"
#import "UILabel+Boldify.h"
于 2015-01-03T23:00:41.383 回答