2016-02-25 2 views
10

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

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

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

+0

некоторых библиотек: 1. https://github.com/hoteltonight/HTAutocompleteTextField 2. https://github.com/Mazyod/ MJAutoComplete –

ответ

2

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

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

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

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

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

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

Примечание: Вы только запросить сервер один раз, чтобы свести к минимуму PErF Impact

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