【问题标题】:Autocomplete UITextField自动完成 UITextField
【发布时间】:2013-01-17 17:24:02
【问题描述】:

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

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

还是一样

【问题讨论】:

    标签: ios objective-c cocoa-touch


    【解决方案1】:

    听起来像 HTAutocompleteTextField 可以完成这项工作:

    https://github.com/hoteltonight/HTAutocompleteTextField

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

    【讨论】:

      【解决方案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;
      }
      

      请注意,您可能需要稍微微调一下,因为它例如当用户删除文本时也会自动完成。但这应该会让你走上正轨。

      【讨论】:

      • 谢谢!,多年来一直在努力解决这个问题!终于排序了!
      【解决方案3】:

      您应该尝试 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 方法中发生了什么。

      【讨论】:

      • 仅仅附加字符串是不正确的,因为用户可能会在不同的地方插入字符。您需要替换字符串中的给定范围。
      • @frenetischapplaudierend 你是对的。我没想到。
      • 退格删除时不处理。无法从文本字段中删除工厂
      • 你是对的@Tom。要正确地做事,您绝对应该使用此方法 (developer.apple.com/library/mac/documentation/Cocoa/Reference/…) 而不是简单地附加字符串。您还应该检查一个空字符串以正确处理删除。您还需要了解范围在不同用例中的行为方式,例如追加、删除、粘贴、插入、选择和替换。
      • 我认为接受的答案在删除时也不起作用。正确执行自动完成需要更多代码,并且这种委托方法行为可能很难理解。我的回答是证明返回 NO 可以让您自行控制文本替换。
      【解决方案4】:

      您还可以查看此控件 (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"
      

      【讨论】:

        猜你喜欢
        • 2011-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-24
        • 1970-01-01
        • 2016-04-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多