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