iOS updateSearchResultsForSearchController只调用一次

时间:2016-07-25 23:58:22

标签: ios swift uisearchbar uisearchcontroller

我一直在尝试在应用中实现UISearchController,作为参考,我正在关注this教程。本教程比我需要的更多(比如范围),所以我只是浏览它,但是当我运行我的测试应用程序时,搜索没有用。当我在搜索栏中输入时,它只会过滤我输入的第一个字符的结果,无论我是否按下"搜索"或不。例如,如果我输入" dolphin",它只会显示包含" d"的结果。通过在updateSearchResultsForSearchController内打印,我确认它只被调用一次。

但是,如果我删除了搜索栏中的所有内容,结果会回到未经过滤的状态,如果我再次输入内容,则会(再次)仅过滤第一个字符。

我还尝试了here建议的解决方法,但问题仍然存在。这是我的代码:

class SearchController: UITableViewController, UISearchResultsUpdating, UISearchBarDelegate {
    let data = [
        "bottlenose dolphin": 111,
        "manta ray": 172,
        "humphead wrasse": 388,
        "Commerson's dolphin": 19
        // etc.
    ]

    var results = [String: Int]()
    let searchController = UISearchController(searchResultsController: nil)

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

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if searchController.active && searchController.searchBar.text != "" {
            return results.count
        } else {
            return data.count
        }
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
        if searchController.active && searchController.searchBar.text != "" {
            let index = results.startIndex.advancedBy(indexPath.row)
            cell.textLabel!.text = results.keys[index]
        } else {
            let index = data.startIndex.advancedBy(indexPath.row)
            cell.textLabel!.text = data.keys[index]
        }
        return cell
    }

    func search(searchText: String) {
        let temp = data.filter({(element: (String, Int)) -> Bool in
            return element.0.lowercaseString.containsString(searchText.lowercaseString)
        })
        for element in temp { results[element.0] = element.1 }
        tableView.reloadData()
    }

    func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
        updateSearchResultsForSearchController(searchController)
    }

    func updateSearchResultsForSearchController(searchController: UISearchController) {
        search(searchController.searchBar.text!)
    }
}

我在浏览教程时错过了一个步骤的可能性,但我已经多次查看了它,但无济于事。如何使搜索正常进行?

编辑:我还注意到,有时搜索会弹出结果,甚至不包含查询的第一个字符。例如,使用不同的数据集,搜索" J"弹出"硅谷" ...

1 个答案:

答案 0 :(得分:1)

您忘记删除之前的results

func search(searchText: String) {
    let temp = data.filter({(element: (String, Int)) -> Bool in
        return element.0.lowercaseString.containsString(searchText.lowercaseString)
    })
    results.removeAll() // clear previous ones
    for element in temp { results[element.0] = element.1 }
    tableView.reloadData()
}