iOS updateSearchResultsForSearchController 只调用了一次
iOS updateSearchResultsForSearchController only called once
我一直在尝试在应用程序中实现 UISearchController,作为参考,我遵循了 this 教程。本教程涵盖的内容比我需要的多一些(比如范围),所以我只是浏览了一下,但是当我 运行 我的测试应用程序时,搜索不起作用。当我在搜索栏中输入时,它只过滤我输入的第一个字符的结果,无论我是否按下 "search"。例如,如果我输入 "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"弹出"Silicon Valley"...
您忘记删除之前的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()
}
我一直在尝试在应用程序中实现 UISearchController,作为参考,我遵循了 this 教程。本教程涵盖的内容比我需要的多一些(比如范围),所以我只是浏览了一下,但是当我 运行 我的测试应用程序时,搜索不起作用。当我在搜索栏中输入时,它只过滤我输入的第一个字符的结果,无论我是否按下 "search"。例如,如果我输入 "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"弹出"Silicon Valley"...
您忘记删除之前的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()
}