ios iphone autocomplete textfield

Autocompletar para UITextfield en iOS



iphone autocomplete (4)

Puede usar los siguientes enlaces que describen cómo podemos usar el autocompletado. Intenté con AutocompletionTableview (segundo enlace) y funcionó perfectamente.

https://github.com/EddyBorja/MLPAutoCompleteTextField

https://github.com/keyf/AutocompletionTableView

Estoy trabajando en una nueva aplicación de iOS. En esa aplicación, tengo 5 UITextFields y esos son 1. primer interés, segundo interés hasta 5 intereses.

Necesito agregar Autocompletar para esos 5 UITextFields. He buscado google por un día. Tengo algunos foros y tutoriales para eso. Pero incluso he intentado con enlaces de Github también.

De acuerdo con mi requerimiento, tengo una serie de datos que se obtienen de mi servidor. En ese conjunto, tengo datos como, café, cricket, etc. Son datos de Autocompletar. Necesito mostrar esa matriz cada vez que el usuario ingrese texto en UITextField, si está relacionado con mi matriz de datos, necesita mostrar debajo de ese UITextFields.

Para ese propósito utilicé el siguiente código.

** // Cadena en campo de texto de búsqueda

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

**

// Toma la cadena del campo de texto de búsqueda y compárala con la matriz de autocompletar

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

Y creé UITableView como AutocompleteTableview en el método ViewDidLoad .

** El problema es, si escribo texto como supongo "c", de mi matriz de datos que muestran el texto que contiene como letra "c" en la tabla vista. Pero, si escribí "coff", no se mostrarán datos en ese UITableView. También cómo validar qué usuario de UITextField hace clic en el método delegado tableviewdidselectrowatindexpath . Intenté con la asignación de etiquetas para esos UITextFields, pero su funcionamiento en UITextFields delega métodos solamente, no en otro lugar. por lo tanto, cada vez que selecciono datos de UITableView, primero UITextField solo toma datos, no otro UITextField.

Por favor, dé su valiosa sugerencia, que es la mejor manera de mostrar el autocompletado para UITextfields en iOS para múltiples UITextfields y cómo manejar UITableView para mostrar datos. Si hay algún error en mi contenido, discúlpeme y proporcione sus valiosas sugerencias para solucionar este problema.

Gracias****


Toma dos Global Array

NSMutableArray *muary_Interest_Main; NSMutableArray *muary_Interest_Sub;

EN el método 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];

Ahora escribe un código a continuación en los delegados del campo de texto.

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

Escribe un método para el texto de búsqueda

-(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 Delegates methods

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

Esto también funciona en el retroceso del campo de texto. Prueba esto. Espero que esto se adapte a sus necesidades.


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


Aquí hay un rápido ejemplo de campo de texto de autocompletado 3 en línea

  1. La imagen se ve como abajo

  2. crea un proyecto y agrega un campo de texto. Conéctese al controlador de visualización llamado txtAutoComplete

  3. Ver código de controlador abajo

    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. El código fuente se da a GitHub.GitHub Link: https://github.com/enamul95/AutoCompleteTextField