如何在Swift中创建自动完成文本字段

Swi*_*per 14 json autocomplete ios swift

我想要创建的是iOS中的自动完整文本字段.

我有一个用于选择客户端的表单,其中用户必须使用文本字段选择一次客户端.我希望发生的是,当用户在文本字段中写入的前三个字母,我想要一些服务中使用输入的文本运行远程Web服务查询,并提交查询结果自动完成建议.

以下是我当前的应用程序代码(仅适用于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()
}
Run Code Online (Sandbox Code Playgroud)

这是我的Web服务提供的json输出.

["123,John", "343,Smith", "345,April"]
Run Code Online (Sandbox Code Playgroud)

用逗号分隔,第一个参数是client ID,第二个参数是客户端的名称.John那么它应该在自动完成建议,这些建议如果选择将设置的文本提交的名称clientTextFieldJohn.

它的当前文本内容clientTextField作为GET参数传递给我的webservice.

我不知道该怎么做.用户可能正在键入但尚未完成,而多个查询可能已经发送过.

谢谢.

iwillnot:我在下面的Swift上收集了对自动完整文本字段的引用.

参考在Swift上创建自动完整文本字段

https://github.com/mnbayan/AutocompleteTextfieldSwift(2016年 7月)

http://github.com/Mazyod/MJAutoComplete(2015年 7月)

http://github.com/hoteltonight/HTAutocompleteTextField(2015年 3月)

https://github.com/gaurvw/MPGTextField(2014年 6月)

截至2016年8月19日的最后更新订购.

maf*_*rja 4

我在我的应用程序中做了类似的事情来查找联系人。我将对此进行伪代码,以便您理解这个概念:

1) 捕获最终用户在文本字段中输入的字符

2) 在输入的某些字符数处决定查询服务器以返回所有匹配的条目 - 选择您满意的字符数(我选择了大约 3-4 个字符)。更少的回报更多,更多的回报不太明显......取决于您、性能和用户体验的考虑。

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()
  }  
}
Run Code Online (Sandbox Code Playgroud)