Display table view when searchBar (from searchController) begin edited Swift

左心房为你撑大大i 提交于 2019-12-06 13:53:40

问题


I already seen this question : How to show tableview when user taps searchbar swift It's the same issue as me but when I use the answer it can't work for me.

When I click on the button search, only the searchbar appears on the search controller then if I type something the tableView doesn't appear at all. I use Swift 3. The best example for what I want to do is the Instagram search function. When user tap the searchbar a tableView comes as a subView.

I show you my current code of my SearchViewController (where I search for a username in Firebase) :

class SearchViewController: UIViewController, UISearchBarDelegate {

var tableViewController: UserTableViewController!
var searchResultController: SearchResultsController!

override func viewDidLoad() {
    super.viewDidLoad()
}

@IBAction func searchWithAddress(_ sender: AnyObject) {
    let searchController = UISearchController(searchResultsController: tableViewController)
    searchController.searchBar.delegate = self
    self.present(searchController, animated: true, completion: nil)
}
}

And here's the code of the TableViewController (How can I display it on the SearchViewController when searchbar is editing?) :

class UserTableViewController: UITableViewController, UISearchResultsUpdating {

var userTab = [String]()
var filteredUsers = [String]()

var searchController: UISearchController!
var resultsController = UITableViewController()

var name: String!
var ref: DatabaseReference!

override func viewDidLoad() {
    super.viewDidLoad()

    self.resultsController.tableView.dataSource = self
    self.resultsController.tableView.delegate = self

    ref = Database.database().reference()
    ref.child("users").queryOrdered(byChild: "pseudo").observeSingleEvent(of: .value, with: { (snapshot) in
        self.userTab = []
        if (snapshot.value is NSNull) {
            print("No data")
        } else {
            for child in snapshot.children {
                let userSnap = child as! DataSnapshot
                let uid = userSnap.key
                let userDict = userSnap.value as! [String: AnyObject]
                let pseudo = userDict["pseudo"] as! String // Find username in Firebase
                self.userTab.append(pseudo) // And put all username in an array
                self.resultsController.tableView.reloadData()
                continue
            } } })

    self.searchController = UISearchController(searchResultsController: self.resultsController)
    self.tableView.tableHeaderView = self.searchController.searchBar
    self.searchController.searchResultsUpdater = self
    self.searchController.dimsBackgroundDuringPresentation = false
    self.definesPresentationContext = true
}

func updateSearchResults(for searchController: UISearchController) {
    self.filteredUsers = self.userTab.filter { (user:String) -> Bool in
        if user.lowercased().contains(self.searchController.searchBar.text!.lowercased()) {
            return true
        } else {
            return false
        }
    }
    self.resultsController.tableView.reloadData()
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "userProfil" { // For see the user profil
            let userViewController = segue.destination as! UserViewController
            userViewController.pseudo = self.name!
    }
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if tableView == self.tableView {
        return self.userTab.count
    } else {
        return self.filteredUsers.count
    }
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell()
    if tableView == self.tableView {
        cell.textLabel?.text = self.userTab[indexPath.row]
    } else {
        cell.textLabel?.text = self.filteredUsers[indexPath.row]
    }
    return cell
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let post = filteredUsers[indexPath.row] as! String
    self.name = post
    performSegue(withIdentifier: "userProfil", sender: nil)
}
}

来源:https://stackoverflow.com/questions/46832576/display-table-view-when-searchbar-from-searchcontroller-begin-edited-swift

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!