2016-02-25 12 views
10

Quello che voglio essere in grado di creare è un campo di testo completo automatico in iOS.Come creare un campo di testo a completamento automatico in Swift

Ho un modulo per selezionare un client, in cui l'utente deve selezionare un client una volta utilizzando un campo di testo. Quello che voglio succedere è quando l'utente scrive le prime tre lettere sul campo di testo, voglio che alcuni servizi eseguano una query di servizio Web remoto usando il testo inserito e presentino i risultati della query come suggerimenti di completamento automatico.

Di seguito è riportato il mio codice corrente per la mia app (solo iPad).

import UIKit 

    class AddClientViewController: UIViewController, UITextFieldDelegate { 

     @IBOutlet weak var clientTextField: UITextField! 

     var foundList = [String]() 


    override func viewDidLoad() { 
     super.viewDidLoad() 



     let listUrlString = "http://bla.com/myTextField.php?field=\(clientTextField)" 
     let myUrl = NSURL(string: listUrlString); 
     let request = NSMutableURLRequest(URL:myUrl!); 
     request.HTTPMethod = "GET"; 

     let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
      data, response, error in 

      if error != nil { 
       print(error!.localizedDescription) 
       dispatch_sync(dispatch_get_main_queue(),{ 
        AWLoader.hide() 

       }) 

       return 
      } 


      do { 

       let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSArray 

       if let parseJSON = json { 


        self.foundList = parseJSON as! [String] 

       } 


     } catch { 

      print(error) 

     } 
    } 

    task.resume() 
} 

Ecco l'output JSON fornito dal mio servizio web.

["123,John", "343,Smith", "345,April"] 

separati da virgole, il primo parametro è il client ID e il secondo parametro è il nome del cliente. John è il nome quindi deve essere presentato nei suggerimenti di completamento automatico, che se selezionato imposterà il testo di clientTextField a John.

Il contenuto di testo corrente di clientTextField viene passato come parametro GET al mio servizio web.

Non so come farlo. L'utente potrebbe digitare e non ancora terminato, mentre più query potrebbero già essere state inviate.

Grazie.

Iwillnot: ho raccolto i riferimenti ai campi di testo di completamento automatico su Swift di seguito.

I riferimenti per la creazione di auto campi di testo completo su Swift

https://github.com/mnbayan/AutocompleteTextfieldSwift (luglio 2016)

http://github.com/Mazyod/MJAutoComplete (luglio 2015)

http://github.com/hoteltonight/HTAutocompleteTextField (Marzo 2015)

https://github.com/gaurvw/MPGTextField (giugno 2014)

Ordinato dall'ultimo aggiornamento il 19 agosto 2016.

+0

alcune librerie: 1. https://github.com/hoteltonight/HTAutocompleteTextField 2. https://github.com/Mazyod/ MJAutoComplete –

risposta

2

Ho fatto qualcosa di simile nella mia app per cercare contatti. Io pseudo codice di questo per farvi capire il concetto:

1) Cattura i caratteri immessi nel campo testuale dall'utente finale

2) Ad un certo Numero caratteri inserito decidere di interrogare il server per restituire tutte le voci che corrispondono a - scegli il numero di caratteri con cui ti trovi a tuo agio (ho scelto circa 3-4 caratteri). Meno ritorni di più, più rendimenti meno ovviamente ... fino a te, perf e UX.

3) Inserire i risultati di questa query server in un array sul client. Questo sarà il tuo superset dal quale offrirai i suggerimenti all'utente.

4) Dopo che ogni carattere successivo è stato inserito nel campo di testo, ora si filtra l'array (array.filter()) per la stringa di caratteri immessa in questo punto. 5) tableView.reloadData() rispetto alla matrice filtrata per ogni carattere inserito.

6) Uso una variabile dataFlag per determinare quale origine dati mostrare nella vista tabella a seconda di cosa sta facendo l'utente.

Nota: è solo una query al server una volta per minimizzare l'impatto perf

// this function is called automatically when the search control get user focus 
func updateSearchResults(for searchController: UISearchController) { 
    let searchBar = searchController.searchBar 
    if searchBar.text?.range(of: "@") != nil { 
    self.getUserByEmail(searchBar.text!) 
    } 
    if searchController.searchBar.text?.characters.count == 0 && dataFlag != "showParticipants" { 
    dataFlag = "showInitSearchData" 
    self.contacts.removeAll() 
    self.participantTableView.reloadData() 
    } 
    if dataFlag == "showInitSearchData" && searchController.searchBar.text?.characters.count == 2 { 
    self.loadInitialDataSet() { 
     self.dataFlag = "showFilteredSearchData" 
    } 
    } 
    if dataFlag == "showFilteredSearchData" { 
    self.filterDataForSearchString() 
    } 

} 

// filter results by textfield string 
func filterDataForSearchString() { 
    let searchString = searchController.searchBar.text 
    self.filteredContacts = self.contacts.filter({ 
    (contact) -> Bool in 
    let contactText: NSString = "\(contact.givenName) \(contact.familyName)" as NSString 

    return (contactText.range(of: searchString!, options: NSString.CompareOptions.caseInsensitive).location) != NSNotFound 
    }) 

    DispatchQueue.main.async { 
    self.participantTableView.reloadData() 
    } 
} 
Problemi correlati