SearchViewController.swift 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. //
  2. // SearchViewController.swift
  3. // Demo
  4. //
  5. // Created by IEMacBook01 on 16/06/16.
  6. // Copyright © 2016 Iftekhar. All rights reserved.
  7. //
  8. import UIKit
  9. class SearchViewController: UITableViewController, UISearchResultsUpdating, UISearchBarDelegate {
  10. let dataList = [["name": "David Smith", "email": "david@example.com"],
  11. ["name": "Kevin John", "email": "kjohn@example.com"],
  12. ["name": "Jacob Brown", "email": "jacobb@example.com"],
  13. ["name": "Paul Johnson", "email": "johnsonp@example.com"],
  14. ["name": "Sam William", "email": "willsam@example.com"],
  15. ["name": "Brian Taylor", "email": "btaylor@example.com"],
  16. ["name": "Charles Smith", "email": "charless@example.com"],
  17. ["name": "Andrew White", "email": "awhite@example.com"],
  18. ["name": "Matt Thomas", "email": "mthomas@example.com"],
  19. ["name": "Michael Clark", "email": "clarkm@example.com"]]
  20. var filteredList = [[String: String]]()
  21. var searchController: UISearchController!
  22. override func viewDidLoad() {
  23. super.viewDidLoad()
  24. self.searchController = UISearchController(searchResultsController: nil)
  25. self.searchController.searchResultsUpdater = self
  26. self.searchController.obscuresBackgroundDuringPresentation = false
  27. self.searchController.searchBar.scopeButtonTitles = ["All", "Name", "Email"]
  28. self.searchController.searchBar.delegate = self
  29. self.searchController.searchBar.sizeToFit()
  30. if #available(iOS 11.0, *) {
  31. navigationItem.searchController = searchController
  32. } else {
  33. self.tableView.tableHeaderView = self.searchController.searchBar
  34. }
  35. }
  36. override func viewDidAppear(_ animated: Bool) {
  37. super.viewDidAppear(animated)
  38. }
  39. func searchForText(_ searchText: String?, scope: Int) {
  40. guard let text = searchText, !text.isEmpty else {
  41. self.filteredList = self.dataList
  42. return
  43. }
  44. if scope == 0 {
  45. self.filteredList = self.dataList.filter({ (obj: [String: String]) -> Bool in
  46. if obj["name"]?.contains(text) == true || obj["email"]?.contains(text) == true {
  47. return true
  48. } else {
  49. return false
  50. }
  51. })
  52. } else if scope == 1 {
  53. self.filteredList = self.dataList.filter({ (obj: [String: String]) -> Bool in
  54. if obj["name"]?.contains(text) == true || obj["email"]?.contains(text) == true {
  55. return true
  56. } else {
  57. return false
  58. }
  59. })
  60. } else if scope == 2 {
  61. self.filteredList = self.dataList.filter({ (obj: [String: String]) -> Bool in
  62. if obj["email"]?.contains(text) == true {
  63. return true
  64. } else {
  65. return false
  66. }
  67. })
  68. }
  69. }
  70. func updateSearchResults(for searchController: UISearchController) {
  71. self.searchForText(searchController.searchBar.text, scope: searchController.searchBar.selectedScopeButtonIndex)
  72. self.tableView.reloadData()
  73. }
  74. func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
  75. self.updateSearchResults(for: self.searchController)
  76. }
  77. // MARK: - Table view data source
  78. override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  79. if searchController.isActive == false {
  80. return dataList.count
  81. } else {
  82. return filteredList.count
  83. }
  84. }
  85. override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  86. var cell = tableView.dequeueReusableCell(withIdentifier: "UITableViewCell")
  87. if cell == nil {
  88. cell = UITableViewCell(style: .subtitle, reuseIdentifier: "UITableViewCell")
  89. }
  90. if searchController.isActive == false {
  91. cell?.textLabel?.text = dataList[indexPath.row]["name"]
  92. cell?.detailTextLabel?.text = dataList[indexPath.row]["email"]
  93. } else {
  94. cell?.textLabel?.text = filteredList[indexPath.row]["name"]
  95. cell?.detailTextLabel?.text = filteredList[indexPath.row]["email"]
  96. }
  97. return cell!
  98. }
  99. }