我一直在尝试在应用中实现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"弹出"硅谷" ...
答案 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()
}