【问题标题】:AutoComplete for UITextfield in iOSiOS 中 UITextfield 的自动完成功能
【发布时间】:2014-11-24 15:24:06
【问题描述】:

我正在开发新的 iOS 应用程序。在那个应用程序中,我有 5 个 UITextField,它们是 1.第一兴趣,第二兴趣最多5个兴趣。

我需要为这 5 个 UITextField 添加自动完成功能。我在谷歌上搜索了一天。我有一些论坛和教程。但我什至也尝试过使用 Github 链接。

根据我的要求,我有一组从我的服务器获取的数据。在那个数组中,我有咖啡、板球等数据。这是自动完成数据。每当用户在 UITextField 中输入文本时,我都需要显示该数组,如果它与我的数据数组相关,则需要在该 UITextFields 下方显示。

为此,我使用了以下代码。

**// 搜索文本字段中的字符串

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

NSString *substring = [NSString stringWithString:textField.text];
    substring = [substring stringByReplacingCharactersInRange:range withString:string];
    [self searchAutocompleteEntriesWithSubstring:substring];
    return YES;
}

**

// 从搜索文本字段中获取字符串并与自动完成数组进行比较

- (void)searchAutocompleteEntriesWithSubstring:(NSString *)substring {

// Put anything that starts with this substring into the autoCompleteArray
// The items in this array is what will show up in the table view

[autoCompleteArray removeAllObjects];
NSLog(@"autoCompleteArray %@",autoCompleteArray);
for(NSString *curString in elementArray) {
    NSRange substringRangeLowerCase = [curString rangeOfString:[substring lowercaseString]];
    NSRange substringRangeUpperCase = [curString rangeOfString:[substring uppercaseString]];

    if (substringRangeLowerCase.length != 0 || substringRangeUpperCase.length != 0) {
        [autoCompleteArray addObject:curString];
    }
}

autoCompleteTableView.hidden = NO;
[autoCompleteTableView reloadData];
      }

我在ViewDidLoad 方法中将 UITableView 创建为AutocompleteTableview

**问题是,如果我输入文本为假设“c”,则从我的数据数组中显示任何文本包含为 tableview 中的“c”字母。但是,如果我键入“coff”,则该 UITableView 中不会显示任何数据。还如何验证哪个 UITextField 用户在tableviewdidselectrowatindexpath 委托方法中单击。我尝试为那些 UITextFields 分配标签,但它只在 UITextFields 委托方法中工作,而不是在其他地方。所以,每当我从 UITableView 中选择数据时,首先 UITextField 只获取数据而不是其他 UITextField。

请提出您宝贵的建议,这是在iOS中为多个UITextfields显示UITextfields的自动完成以及如何处理UITableView以显示数据的最佳方式。如果我的内容有任何错误,请原谅我,请提供您宝贵的建议以解决此问题。

谢谢****

【问题讨论】:

  • 您是否尝试过四个问题中的任何一个或只是发布问题?
  • 你输入的是**“coff”还是“coff”?
  • 只有它的 coff,当我发布问题时,我让它变得大胆,这就是为什么它显示一些错误的原因

标签: ios iphone autocomplete textfield


【解决方案1】:
- (void)searchAutocompleteEntriesWithSubstring:(NSString *)substring{

    //Assume this array is the autocomplete array for which you get data from server

    NSMutableArray *autoCompleteArray = [[NSMutableArray alloc] initWithObjects:@"Coffee",@"Cricket",@"Volleyboll",nil];

    text = [text stringByReplacingOccurrencesOfString:@" " withString:@""];

   // This is to create predicate filter for getting matched text 

   NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] %@",text];

// store matched data for autocompletion in results array and reload data in your tableview based on this array's data

   NSArray *resultArray = [[NSArray alloc] initWithArray:[autoCompleteArray filteredArrayUsingPredicate:predicate]];
}

【讨论】:

  • 这是自动完成搜索的逻辑并将其显示在您的表格视图中。
  • 在 textield 中输入文本时,现在不会调用 tableview
【解决方案2】:

您可以使用以下链接来描述我们如何使用自动完成功能。我尝试使用 AutocompletionTableview(第二个链接),效果很好。

https://github.com/EddyBorja/MLPAutoCompleteTextField

https://github.com/keyf/AutocompletionTableView

【讨论】:

    【解决方案3】:

    取两个全局数组

    NSMutableArray *muary_Interest_Main;
    NSMutableArray *muary_Interest_Sub;
    

    在 viewDidLoad 方法中

    muary_Interest_Main = [[NSMutableArray alloc]initWithObjects:@"Cricket",@"Dancing",@"Painting",@"Swiming",@"guitar",@"movie",@"boxing",@"drum",@"hockey",@"chessing",@"gamming", 
        @"hunting",@"killing",@"shoping",@"jamm"@"zooming", nil]; 
    muary_Interest_Sub = [[NSMutableArray alloc]init]; 
    
    
    tbl_Search = [[UITableView alloc] initWithFrame: 
    CGRectMake(4, 200, 320, 120) style:UITableViewStylePlain]; 
    tbl_Search.delegate = self; 
    tbl_Search.dataSource = self; 
    tbl_Search.scrollEnabled = YES; 
    
    [self.tbl_Search registerClass:[UITableViewCell class] forCellReuseIdentifier:@"CellIdentifier"]; 
    [self.view addSubview:self.tbl_Search]; 
    
    
    [tbl_Search setHidden:TRUE];
    

    现在在文本字段委托中编写以下代码。

    - (void)textFieldDidBeginEditing:(UITextField *)textField 
    { 
    NSLog(@"%d",textField.tag); 
    int_TextFieldTag = textField.tag; 
    
    [self searchText:textField replacementString:@"Begin"]; 
    } 
    
    - (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    [textField resignFirstResponder]; 
    tbl_Search.hidden = TRUE; 
    return YES; 
    } 
    
    - (void)textFieldDidEndEditing:(UITextField *)textField 
    { 
    tbl_Search.hidden = TRUE; 
    } 
    
    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
    { 
    [self searchText:textField replacementString:string]; 
    return YES; 
    }
    

    写一个搜索文本的方法

    -(void) searchText:(UITextField *)textField replacementString:(NSString *)string
    {
    
        if(int_TextFieldTag == 1)
        {
            tbl_Search.frame = CGRectMake(4, 200, 320, 120);
    
        }
        else if(int_TextFieldTag == 2)
        {
            tbl_Search.frame = CGRectMake(4, 248, 320, 120);
        }
        else if(int_TextFieldTag == 3)
        {
            tbl_Search.frame = CGRectMake(4, 268, 320, 120);
        }
        else if(int_TextFieldTag == 4)
        {
            tbl_Search.frame = CGRectMake(4, 268, 320, 120);
        }
        else
        {
            tbl_Search.frame = CGRectMake(4, 268, 320, 120);
        }
    
    
    
        NSString *str_Search_String=[NSString stringWithFormat:@"%@",textField.text];
        if([string isEqualToString:@"Begin"])
            str_Search_String=[NSString stringWithFormat:@"%@",textField.text];
        else if([string isEqualToString:@""])
            str_Search_String = [str_Search_String substringToIndex:[str_Search_String length] - 1];
        else
            str_Search_String=[str_Search_String stringByAppendingString:string];
    
        muary_Interest_Sub=[[NSMutableArray alloc] init];
        if(str_Search_String.length>0)
        {
            NSInteger counter = 0;
            for(NSString *name in muary_Interest_Main)
            {
                NSRange r = [name rangeOfString:str_Search_String options:NSCaseInsensitiveSearch];
                if(r.length>0)
                {
                    [muary_Interest_Sub addObject:name];
                }
    
                counter++;
    
            }
    
            if (muary_Interest_Sub.count > 0)
            {
                NSLog(@"%@",muary_Interest_Sub);
                tbl_Search.hidden = FALSE;
                [self.tbl_Search reloadData];
            }
            else
            {
               tbl_Search.hidden = TRUE;
            }
    
    
    
        }
        else
        {
            [tbl_Search setHidden:TRUE];
    
        }
    
    }
    

    Tableview 委托方法

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    { 
    return 1; 
    } 
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    { 
    return [muary_Interest_Sub count]; 
    } 
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier"]; 
    if (cell == nil) 
    { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"CellIdentifier"]; 
    //cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    ; 
    } 
    cell.textLabel.text = [muary_Interest_Sub objectAtIndex:indexPath.row]; 
    return cell; 
    
    } 
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
    [self.view endEditing:YES]; 
    if(int_TextFieldTag == 1) 
    { 
    txt1.text=[muary_Interest_Sub objectAtIndex:indexPath.row]; 
    
    } 
    else if(int_TextFieldTag == 2) 
    { 
    txt2.text=[muary_Interest_Sub objectAtIndex:indexPath.row]; 
    } 
    else if(int_TextFieldTag == 3) 
    { 
    txt3.text=[muary_Interest_Sub objectAtIndex:indexPath.row]; 
    } 
    else if(int_TextFieldTag == 4) 
    { 
    txt4.text=[muary_Interest_Sub objectAtIndex:indexPath.row]; 
    } 
    else 
    { 
    txt5.text=[muary_Interest_Sub objectAtIndex:indexPath.row]; 
    } 
    
    } 
    

    这也适用于文本字段的退格。 尝试这个。希望这能满足您的要求。

    【讨论】:

    • txt_Interest 是您的 texfield 名称,如果用户开始在此字段中输入,然后该方法将调用
    • 如果您想对所有 textFiled 进行相同的操作并使用相同的数组,则无需检查条件只需调用方法
    • 进来聊天会在那里讨论
    • 最后这是很棒的代码,它对我很有帮助,感谢Mr.Maul 花了很长时间解决我的问题并给出了一个很好的解决方案!真的非常感谢
    【解决方案4】:

    这是 swift 3 内联自动完成文本字段示例

    1. 图像如下所示

    2. 创建一个项目并添加一个文本字段。连接到名为 txtAutoComplete 的视图控制器

    3. 查看下面的控制器代码

       import UIKit
      
         class ViewController: UIViewController ,UITextFieldDelegate{
      
      
          @IBOutlet weak var txtAutoComplete: UITextField!
      
           var autoCompletionPossibilities = ["01921687433", "01553377642", "0155776622"]
          var autoCompleteCharacterCount = 0
         var timer = Timer()
      
      
        override func viewDidLoad() {
           super.viewDidLoad()
      
      
            txtAutoComplete.delegate = self
       }
      
      
      
      
      
         func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { //1
             var subString = (textField.text!.capitalized as NSString).replacingCharacters(in: range, with: string) 
      subString = formatSubstring(subString: subString)
      
         if subString.characters.count == 0 { 
         // 3 when a user clears the textField
          resetValues()
             } else {
           searchAutocompleteEntriesWIthSubstring(substring: subString)   
          }
         return true
        }
      
       func formatSubstring(subString: String) -> String {
          let formatted = String(subString.characters.dropLast(autoCompleteCharacterCount)).lowercased().capitalized //5
          return formatted
       }
      
      func resetValues() {
         autoCompleteCharacterCount = 0
         txtAutoComplete.text = ""
        }
      
        func searchAutocompleteEntriesWIthSubstring(substring: String) {
        let userQuery = substring
        let suggestions = getAutocompleteSuggestions(userText: substring) 
      
          if suggestions.count > 0 {
            timer = .scheduledTimer(withTimeInterval: 0.01, repeats: false, block: { (timer) in //2
              let autocompleteResult =   self.formatAutocompleteResult(substring: substring, possibleMatches: suggestions)
                 self.putColourFormattedTextInTextField(autocompleteResult: autocompleteResult, userQuery : userQuery) 
                self.moveCaretToEndOfUserQueryPosition(userQuery: userQuery) 
            })
      
           } else {
             timer = .scheduledTimer(withTimeInterval: 0.01, repeats: false, block: { (timer) in //7
                self.txtAutoComplete.text = substring
             })
             autoCompleteCharacterCount = 0
           }
      
      }
      
       func getAutocompleteSuggestions(userText: String) -> [String]{
         var possibleMatches: [String] = []
         for item in autoCompletionPossibilities { //2
            let myString:NSString! = item as NSString
            let substringRange :NSRange! = myString.range(of: userText)
      
            if (substringRange.location == 0)
             {
                possibleMatches.append(item)
            }
         }
         return possibleMatches
      }
      
       func putColourFormattedTextInTextField(autocompleteResult: String, userQuery : String) {
            let colouredString: NSMutableAttributedString = NSMutableAttributedString(string: userQuery + autocompleteResult)
      colouredString.addAttribute(NSForegroundColorAttributeName, value: UIColor.green, range: NSRange(location: userQuery.characters.count,length:autocompleteResult.characters.count))
      self.txtAutoComplete.attributedText = colouredString
      }
      
       func moveCaretToEndOfUserQueryPosition(userQuery : String) {
          if let newPosition = self.txtAutoComplete.position(from: self.txtAutoComplete.beginningOfDocument, offset: userQuery.characters.count) {
          self.txtAutoComplete.selectedTextRange = self.txtAutoComplete.textRange(from: newPosition, to: newPosition)
      }
            let selectedRange: UITextRange? = txtAutoComplete.selectedTextRange
      txtAutoComplete.offset(from: txtAutoComplete.beginningOfDocument, to: (selectedRange?.start)!)
         }
      
       func formatAutocompleteResult(substring: String, possibleMatches: [String]) -> String {
           var autoCompleteResult = possibleMatches[0]
      autoCompleteResult.removeSubrange(autoCompleteResult.startIndex..<autoCompleteResult.index(autoCompleteResult.startIndex, offsetBy: substring.characters.count))
      autoCompleteCharacterCount = autoCompleteResult.characters.count
      return autoCompleteResult
          }
        }
      
    4. 源码给GitHub.GitHub链接:https://github.com/enamul95/AutoCompleteTextField

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      相关资源
      最近更新 更多