iOS UITableView在搜索时不会重新加载数据

时间:2017-08-03 02:23:05

标签: ios swift uitableview uisearchbar uisearchcontroller

我正在实施像Instagram这样的搜索页面 - 这样当您转到搜索标签时,您会看到趋势搜索(带有动态部分)等,但当您开始在搜索框中输入时,趋势搜索会离开,显示搜索结果。

我做到了这一点,但它似乎无法奏效。 A)当我搜索某些内容时没有显示结果(我记录了来自api调用的响应 - 我正确地获取数据)。 B)即使在我取消取消后,我也不会返回显示趋势结果(再次,我在cancelSearch操作中打印,该函数正在被调用)

这是我的代码的简化版本:

class SearchVC: UITableViewController {

let searchController = UISearchController(searchResultsController: nil)

var sections = [String]()
var allTrendingOfferings = [[OfferingModel]]()
var allSearchResultOfferings = [OfferingModel]()

override func viewDidLoad() {
    super.viewDidLoad()

    sections = // data from backend
    allTrendingOfferings = // data from backend

    searchController.searchResultsUpdater = self
    searchController.dimsBackgroundDuringPresentation = false
    definesPresentationContext = true
    tableView.tableHeaderView = searchController.searchBar
}

// MARK: - Table view data source
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    if (searchController.isActive) {
        return ""
    }
    return self.sections[section]
}

override func numberOfSections(in tableView: UITableView) -> Int {
    if (searchController.isActive) {
        return 1
    }
    return self.sections.count
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if (searchController.isActive) {
        return allSearchResultOfferings.count
    }
    return allTrendingOfferings[section].count
}

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

    if (searchController.isActive) {
        let offering = allSearchResultOfferings[indexPath.row]
    } else {
        let offering = allTrendingOfferings[indexPath.section][indexPath.row]
    }
    // configure cell and
    return cell
}

func filterContentForSearchText(searchText: String, scope: String = "All") {
    allSearchResultOfferings = // data fetched from backend
    self.tableView.reloadData() // done asynchronously (after receiving data)
}

func searchCancel() {
    self.tableView.reloadData()
}

}

extension SearchVC: UISearchResultsUpdating {
    @available(iOS 8.0, *)
    func updateSearchResults(for searchController: UISearchController){
        if !searchController.isActive {
            searchCancel()
        }
        filterContentForSearchText(searchText:searchController.searchBar.text!)
    }
}

1 个答案:

答案 0 :(得分:0)

虚警 - 必须退出Xcode,清理并重建项目。它现在就像一个魅力。