使用searchController过滤tableView,但tableView没有更新

时间:2017-01-31 19:42:06

标签: ios arrays swift uitableview uisearchcontroller

我有UITableViewController显示我创建的标签的标题。当我第一次导航到UITableViewController时,它会显示Array标签,但是当我使用UISearchController过滤标签时,我创建的Array存储过滤后的结果会更新并保存正确的数据,但TableView不会更改。这里有两个最有可能导致问题的函数,但为了以防万一,我将把整个班级(不长)放在下面。
numberOfRowsInSection:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if(searchController.searchBar.text != "") {
        return filteredTags.count
    }
    return Tags.count
}

cellForRowAt:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "tagcell", for: indexPath) as! TagCell

    var text = ""
    if (searchController.searchBar.text != ""){
        text = filteredTags[indexPath.row].title
    } else {
        text = Tags[indexPath.row].title
    }

    cell.cellLabel.text = text
    return cell
}

全班:

class TagCell: UITableViewCell{

    @IBOutlet weak var cellLabel: UILabel!
}

class TagTableVC: UITableViewController{

    //Table Content

    var Tags: [Tag] = [globTS.animals, globTS.civilrights, globTS.guncontrol, globTS.gunrights, globTS.LGBTQ, globTS.prochoice, globTS.prolife]
    var filteredTags = [Tag]()

    //Searchbar Initialization
    let searchController = UISearchController(searchResultsController: nil)

    //Required Functions
    override func viewDidLoad() {
        super.viewDidLoad()
        searchController.searchResultsUpdater = self
        searchController.dimsBackgroundDuringPresentation = false
        definesPresentationContext = true
        tableView.tableHeaderView = searchController.searchBar
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if(searchController.searchBar.text != "") {
            return filteredTags.count
        }
        return Tags.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "tagcell", for: indexPath) as! TagCell

        var text = ""
        if (searchController.searchBar.text != ""){
            text = filteredTags[indexPath.row].title
        } else {
            text = Tags[indexPath.row].title
        }

        cell.cellLabel.text = text
        return cell
    }

    //Filters Tags array into Filtered array based on search query
    func filterContentForSearchText(searchText: String, scope: String = "All"){
        filteredTags = Tags.filter{ $0.title.lowercased().contains(searchText.lowercased())}
    }
}

extension TagTableVC: UISearchResultsUpdating {

    //calls the filter function everytime the searchbar is activated
    func updateSearchResults(for searchController: UISearchController) {
        filterContentForSearchText(searchText: searchController.searchBar.text!)
    }
}

1 个答案:

答案 0 :(得分:2)

重新评估filteredTags后,您应该在tableview上调用reloadData

    func filterContentForSearchText(searchText: String, scope: String = "All"){
        filteredTags = Tags.filter{ $0.title.lowercased().contains(searchText.lowercased())}
        self.tableView.reloadData()
    }