diff --git a/pass/Base.lproj/Main.storyboard b/pass/Base.lproj/Main.storyboard index b3c9228..e5a66eb 100644 --- a/pass/Base.lproj/Main.storyboard +++ b/pass/Base.lproj/Main.storyboard @@ -49,10 +49,21 @@ + + + + + + + + + + + - + @@ -151,7 +162,7 @@ - + @@ -280,7 +291,7 @@ - + @@ -309,7 +320,7 @@ - + @@ -353,7 +364,7 @@ - + @@ -389,7 +400,7 @@ - + @@ -408,7 +419,7 @@ - + @@ -427,7 +438,7 @@ - + @@ -482,7 +493,7 @@ - + diff --git a/pass/PasswordTableViewController.swift b/pass/PasswordTableViewController.swift index ce3a771..5276412 100644 --- a/pass/PasswordTableViewController.swift +++ b/pass/PasswordTableViewController.swift @@ -11,13 +11,38 @@ import SwiftGit2 import Result import SVProgressHUD +extension PasswordTableViewController: UISearchResultsUpdating { + func updateSearchResults(for searchController: UISearchController) { + filterContentForSearchText(searchText: searchController.searchBar.text!) + } +} + class PasswordTableViewController: UITableViewController { private var passwordEntities: [PasswordEntity]? + var filteredPasswordEntities = [PasswordEntity]() + let searchController = UISearchController(searchResultsController: nil) override func viewDidLoad() { super.viewDidLoad() passwordEntities = PasswordStore.shared.fetchPasswordEntityCoreData() NotificationCenter.default.addObserver(self, selector: #selector(PasswordTableViewController.actOnPasswordUpdatedNotification), name: NSNotification.Name(rawValue: "passwordUpdated"), object: nil) + searchController.searchResultsUpdater = self + searchController.dimsBackgroundDuringPresentation = false + definesPresentationContext = true + tableView.tableHeaderView = searchController.searchBar + tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: UITableViewScrollPosition.top, animated: false) + } + + func filterContentForSearchText(searchText: String, scope: String = "All") { + filteredPasswordEntities = passwordEntities!.filter { password in + return password.name!.lowercased().contains(searchText.lowercased()) + } + + tableView.reloadData() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) } func actOnPasswordUpdatedNotification() { @@ -27,20 +52,35 @@ class PasswordTableViewController: UITableViewController { } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + if searchController.isActive && searchController.searchBar.text != "" { + return filteredPasswordEntities.count + } return passwordEntities!.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "passwordTableViewCell", for: indexPath) - cell.textLabel?.text = passwordEntities![indexPath.row].name + let password: PasswordEntity + if searchController.isActive && searchController.searchBar.text != "" { + password = filteredPasswordEntities[indexPath.row] + } else { + password = passwordEntities![indexPath.row] + } + cell.textLabel?.text = password.name return cell } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "showPasswordDetail" { if let viewController = segue.destination as? PasswordDetailViewController { - let selectedRow = tableView.indexPathForSelectedRow!.row - viewController.passwordEntity = passwordEntities![selectedRow] + let selectedIndex = self.tableView.indexPath(for: sender as! UITableViewCell)! + let password: PasswordEntity + if searchController.isActive && searchController.searchBar.text != "" { + password = filteredPasswordEntities[selectedIndex.row] + } else { + password = passwordEntities![selectedIndex.row] + } + viewController.passwordEntity = password } } }