2016-02-25 21 views
10

To, co chcę mieć możliwość tworzenia, to automatycznie wypełnione pole tekstowe w systemie iOS.Tworzenie pola autouzupełniania w Swift

Mam formularz do wyboru klienta, w którym użytkownik musi wybrać klienta raz, używając pola tekstowego. To, co chcę zrobić, to gdy użytkownik napisze pierwsze trzy litery w polu tekstowym, chcę, aby w niektórych usługach uruchomiono zdalne zapytanie do usługi sieciowej przy użyciu wprowadzonego tekstu i przedstawiłem wyniki zapytania jako sugestie autouzupełniania.

Poniżej znajduje się mój aktualny kod dla mojej aplikacji (tylko 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() 
} 

Oto dane wyjściowe json, które udostępnia moja usługa internetowa.

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

oddzielone przecinkami, pierwszy parametr jest client ID a drugi parametr to nazwa klienta. John to nazwa, więc powinna być prezentowana w autouzupełnionych sugestiach, które jeśli zostaną wybrane, ustawiają tekst clientTextField na John.

Bieżąca zawartość tekstowa clientTextField jest przekazywana jako parametr GET do mojego serwisu internetowego.

Nie wiem jak to zrobić. Użytkownik może pisać i jeszcze nie skończył, a wiele zapytań mogło już zostać wysłanych.

Dzięki.

iwillnot: Zebrałem odniesienia do pól autouzupełniania na Swift poniżej.

Odniesienia do tworzenia auto kompletne pól tekstowych na Swift

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

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

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

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

Zamówione przez ostatnią aktualizację z 19 sierpnia 2016.

+0

niektórych bibliotek: 1. https://github.com/hoteltonight/HTAutocompleteTextField 2. https://github.com/Mazyod/ MJAutoComplete –

Odpowiedz

2

Zrobiłem coś takiego w mojej aplikacji do wyszukiwania kontaktów. Będę pseudo kod na to uwagę, aby zrozumieć pojęcie:

1) uchwycić znaków wprowadzonych w polu tekstowym przez użytkownika końcowego

2) w pewnym charakterem Liczba wszedł decydowania kwerendy serwera do powrotu wszystkie wpisy, które odpowiadają - wybierz liczbę znaków, które Ci odpowiadają (wybrałem około 3-4 znaków). Mniejsza liczba zwrotów, więcej zwrotów mniej oczywistych ... do ciebie, do perfekcji i do UX.
3) Umieść wyniki tego zapytania serwera w tablicy na kliencie. To będzie Twój nadzbiór, z którego będziesz proponować użytkownikowi sugestie.
4) Po każdym kolejnym znaku wpisanym w polu tekstowym odfiltrujesz teraz tablicę (array.filter()) według wprowadzonego do tego łańcucha znaków. 5) tableView.reloadData() względem przefiltrowanej tablicy przy każdym wprowadzonym znaku.
6) Używam zmiennej dataFlag do określenia źródła danych wyświetlanego w widoku tabeli w zależności od tego, co robi użytkownik.

Uwaga: tylko zapytania do serwera raz, aby zminimalizować wpływ 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() 
    } 
} 
Powiązane problemy