2016-02-25 12 views
10

Was ich erstellen möchte, ist ein automatisches Textfeld in iOS.So erstellen Sie ein Autocomplete-Textfeld in Swift

Ich habe ein Formular zum Auswählen eines Clients, wobei der Benutzer einen Client einmal mithilfe eines Textfelds auswählen muss. Was ich möchte, wenn der Benutzer die ersten drei Buchstaben in das Textfeld schreibt, möchte ich, dass ein Dienst eine Remote-Web-Service-Abfrage mit dem eingegebenen Text ausführt und die Abfrageergebnisse als Auto-Complete-Vorschläge präsentiert.

Unten ist mein aktueller Code für meine App (nur 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() 
} 

Hier ist die Json-Ausgabe, die mein Web-Service bietet.

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

durch Kommata getrennt, ist der erste Parameter die client ID und der zweite Parameter ist der Name des Kunden. John ist der Name, daher sollte er in den Vorschlägen zur automatischen Vervollständigung angezeigt werden. Wenn diese Option ausgewählt wird, wird der Text clientTextField auf John gesetzt.

Der aktuelle Textinhalt der clientTextField wird als GET-Parameter an meinen Webservice übergeben.

Ich weiß nicht, wie dies zu tun. Der Benutzer könnte tippen und noch nicht fertig sein, während mehrere Abfragen bereits gesendet worden sein könnten.

Danke.

iwillnot: Ich habe Referenzen zu automatisch vervollständigten Textfeldern auf Swift unten gesammelt.

Verweise auf Auto-Vervollständigen Textfelder auf Swift Erstellen

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

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

http://github.com/hoteltonight/HTAutocompleteTextField (März 2015)

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

Bestellt durch das letzte Update vom 19. August 2016.

+0

einige Bibliotheken zu minimieren: 1. https://github.com/hoteltonight/HTAutocompleteTextField 2. https://github.com/Mazyod/ MJAutoComplete –

Antwort

2

Ich habe so etwas in meiner App zum Nachschlagen von Kontakten gemacht. Ich werde diesen Pseudo-Code für Sie heraus, das Konzept zu verstehen:

1) Erfassen Sie die Zeichen in das Textfeld durch den Enduser eingegeben

2) Zu einem bestimmten Zeichen eingegeben Zählung entscheiden, den Server abfragen alle Einträge zurück, die passen - Wählen Sie die Anzahl der Zeichen, mit denen Sie sich auskennen (ich habe ungefähr 3-4 Zeichen gewählt). Weniger Renditen mehr, mehr Renditen weniger offensichtlich ... bis zu Ihnen, perf und UX Überlegungen.

3) Versetzen Sie die Ergebnisse dieser Serverabfrage in ein Array auf dem Client. Dies wird Ihre Obermenge sein, von der Sie die Vorschläge dem Benutzer anbieten werden.

4) Nach jedem nachfolgenden Zeichen, das in das Textfeld eingegeben wurde, filtern Sie nun das Array (array.filter()) nach der Zeichenkette, die an diesem Punkt eingegeben wurde. 5) Tabellenansicht.reloadData() für das gefilterte Array bei jedem eingegebenen Zeichen.

6) Ich benutze eine dataFlag-Variable, um zu bestimmen, welche Datenquelle in der Tabellenansicht angezeigt werden soll, abhängig davon, was der Benutzer tut.

Hinweis: Sie können nur den Server einmal abfragen perf Auswirkungen

// 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() 
    } 
} 
Verwandte Themen