web-dev-qa-db-fra.com

Comment créer un champ de texte de saisie semi-automatique dans Swift

Ce que je veux pouvoir créer, c'est un champ de texte de saisie automatique dans iOS.

J'ai un formulaire pour sélectionner un client, dans lequel l'utilisateur doit sélectionner un client une fois en utilisant un champ de texte. Ce que je veux, c'est que lorsque l'utilisateur écrit les trois premières lettres du champ de texte, je souhaite qu'un service exécute une requête de service Web à distance en utilisant le texte saisi et présente les résultats de la requête sous forme de suggestions de saisie semi-automatique.

Vous trouverez ci-dessous mon code actuel pour mon application (iPad uniquement).

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

Voici la sortie json fournie par mon service Web.

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

Séparé par des virgules, le premier paramètre est le client ID et le deuxième paramètre est le nom du client. John est le nom, il doit donc être présenté dans les suggestions de saisie automatique qui, si elles sont sélectionnées, définiront le texte de clientTextField sur John.

Le contenu texte actuel du clientTextField est transmis en tant que paramètre GET à mon service Web.

Je ne sais pas comment faire ça. L'utilisateur peut taper et n'est pas encore terminé, alors que plusieurs requêtes peuvent déjà avoir été envoyées.

Merci.

iwillnot: J'ai collecté des références aux champs de texte à saisie automatique sur Swift ci-dessous.

Références à la création de champs de texte à saisie automatique sur Swift

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

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

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

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

Commandé par dernière mise à jour le 19 août 2016.

14
SwiftDeveloper

J'ai fait quelque chose comme ça dans mon application pour rechercher des contacts. Je vais pseudo coder cela pour que vous compreniez le concept:

1) Capturez les caractères saisis dans le champ de texte par l'utilisateur final

2) À un certain nombre de caractères entré, décidez d'interroger le serveur pour renvoyer toutes les entrées qui correspondent - choisissez le nombre de caractères avec lequel vous êtes à l'aise (j'ai choisi environ 3-4 caractères). Moins de retours plus, plus de retours moins évidemment ... à vous de choisir, les considérations perf et UX.

3) Mettez les résultats de cette requête de serveur dans un tableau sur le client. Ce sera votre sur-ensemble à partir duquel vous offrirez les suggestions à l'utilisateur.

4) Après chaque caractère suivant entré dans le champ de texte, vous allez maintenant filtrer le tableau (array.filter ()) par chaîne de caractères entrée à ce point. 5) tableView.reloadData () par rapport au tableau filtré à chaque caractère entré.

6) J'utilise une variable dataFlag pour déterminer la source de données à afficher dans la table selon ce que fait l'utilisateur.

Remarque: Vous interrogez le serveur une seule fois pour minimiser l'impact sur les performances

// 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()
  }  
}
2
mafarja