Как создать текстовое поле автозаполнения в Swift

То, что я хочу создать, - это автоматическое полное текстовое поле в iOS.

У меня есть форма для выбора клиента, в которой пользователь должен выбрать клиента один раз, используя текстовое поле. То, что я хочу сделать, - это когда пользователь записывает первые три буквы в текстовое поле, я хочу, чтобы какая-либо служба выполняла запрос удаленной веб-службы с использованием введенного текста и представляла результаты запроса в виде автоматических предложений.

Ниже приведен мой текущий код для моего приложения (только 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()
}

Вот json-выход, который предоставляет мой веб-сервис.

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

Отделяется запятыми, первым параметром является client ID, а второй параметр - имя клиента. John - это имя, поэтому оно должно быть представлено в предложениях с полным набором авто, которые, если выбрано, будут устанавливать текст clientTextField на John.

Текущее текстовое содержимое clientTextField передается как параметр GET в мой веб-сервис.

Я не знаю, как это сделать. Пользователь может печатать и еще не закончить, а несколько запросов уже отправлены.

Спасибо.

iwillnot: Я собрал ссылки на автоматическое заполнение текстовых полей на Swift ниже.

Ссылки на создание автоматических полных текстовых полей в Swift

https://github.com/mnbayan/AutocompleteTextfieldSwift (июль 2016 года)

http://github.com/Mazyod/MJAutoComplete (июль 2015 г.)

http://github.com/hoteltonight/HTAutocompleteTextField (март 2015 г.)

https://github.com/gaurvw/MPGTextField (июнь 2014 года)

Упорядочено по последнему обновлению от 19 августа 2016 года.

Ответ 1

Я сделал что-то подобное в своем приложении для поиска контактов. Я буду псевдокодировать это, чтобы вы поняли концепцию:

1) Захват символов, введенных в текстовое поле конечным пользователем

2) При вводе некоторого количества символов решает запросить сервер для возврата всех записей, которые соответствуют - выберите подходящий вам счет (я выбрал около 3-4 символов). Меньше возвращается больше, больше возвращается менее очевидно... до вас, перфекционные и UX-соображения.

3) Поместите результаты этого запроса сервера в массив на клиенте. Это будет ваш суперсет, из которого вы будете предлагать предложения пользователю.

4) После каждого последующего символа, введенного в текстовое поле, вы теперь фильтруете массив (array.filter()) по символьной строке, введенной в эту точку. 5) tableView.reloadData() для фильтрованного массива при каждом введенном символе.

6) Я использую переменную dataFlag, чтобы определить, какой источник данных будет отображаться в представлении таблицы, в зависимости от того, что делает пользователь.

Примечание. Вы только запрашиваете сервер один раз, чтобы свести к минимуму влияние на производительность.

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