UISearchController returns 部分而不是过滤的 tableview 项目
UISearchController returns section instead of the filtered tableview item
我已经实施了 SearchController
,当我使用 SearchController
搜索食品时,它 return 是整个部分。
例如,我将使用 SearchController
搜索 Chocolate
,它会 return 并导致 tableView 显示 Sweets
的整个部分,而不仅仅是Chocolate
,它也会 return Lollipops
。我在这里做错了什么?我是 swift 的新手,我们将不胜感激。谢谢。
struct Food {
let foodTaste: String
let foodList: [String]
}
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
if searchController.searchBar.text! == "" {
filteredFood = food
} else {
filteredFood = food.filter { [=11=].foodList.contains(where: { [=11=].contains(searchController.searchBar.text!) }) }
self.tableView.reloadData()
}
}
var tableView = UITableView()
var food = [Food]()
var filteredFood = [Food]()
let searchController = UISearchController(searchResultsController: nil)
override func viewDidLoad() {
super.viewDidLoad()
filteredFood = food
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
tableView.tableHeaderView = searchController.searchBar
definesPresentationContext = true
tableView.frame = self.view.frame
self.view.addSubview(tableView)
tableView.delegate = self
tableView.dataSource = self
let sweets = Food(foodTaste: "Sweet", foodList: ["Chocolate",
"Lollipops"])
let sour = Food(foodTaste: "Sour", foodList: ["Lemon", "Limes"])
food.append(sweets)
food.append(sour)
}
func numberOfSections(in tableView: UITableView) -> Int {
return filteredFood.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return filteredFood[section].foodList.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .default, reuseIdentifier: nil)
cell.textLabel?.text = filteredFood[indexPath.section].foodList[indexPath.row]
return cell
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return filteredFood[section].foodTaste
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return 4
}
}
公交车在排队
filteredFood = food.filter { [=10=].foodList.contains(where: { [=10=].contains(searchController.searchBar.text!) }) }
实际上你的 food
和 filteredFood
是一个二维数组。第一维是数组本身。第二个 - Food
对象内的内部数组 foodList
。此代码仅过滤此数据结构的外部维度。它说如果在 foodList
中有匹配搜索的字符串,那么整个 Food
对象应该通过过滤器。如果这不是您想要的 - 您还必须创建新的 Food
对象。大概是这样的:
filteredFood = food.filter { [=11=].foodList.contains(where: { [=11=].contains(searchController.searchBar.text!) }) }
.map { Food(foodTaste: [=11=].foodTaste, foodList: [=11=].foodList.filter( {[=11=].contains(searchController.searchBar.text!) }) }
我已经实施了 SearchController
,当我使用 SearchController
搜索食品时,它 return 是整个部分。
例如,我将使用 SearchController
搜索 Chocolate
,它会 return 并导致 tableView 显示 Sweets
的整个部分,而不仅仅是Chocolate
,它也会 return Lollipops
。我在这里做错了什么?我是 swift 的新手,我们将不胜感激。谢谢。
struct Food {
let foodTaste: String
let foodList: [String]
}
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
if searchController.searchBar.text! == "" {
filteredFood = food
} else {
filteredFood = food.filter { [=11=].foodList.contains(where: { [=11=].contains(searchController.searchBar.text!) }) }
self.tableView.reloadData()
}
}
var tableView = UITableView()
var food = [Food]()
var filteredFood = [Food]()
let searchController = UISearchController(searchResultsController: nil)
override func viewDidLoad() {
super.viewDidLoad()
filteredFood = food
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
tableView.tableHeaderView = searchController.searchBar
definesPresentationContext = true
tableView.frame = self.view.frame
self.view.addSubview(tableView)
tableView.delegate = self
tableView.dataSource = self
let sweets = Food(foodTaste: "Sweet", foodList: ["Chocolate",
"Lollipops"])
let sour = Food(foodTaste: "Sour", foodList: ["Lemon", "Limes"])
food.append(sweets)
food.append(sour)
}
func numberOfSections(in tableView: UITableView) -> Int {
return filteredFood.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return filteredFood[section].foodList.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .default, reuseIdentifier: nil)
cell.textLabel?.text = filteredFood[indexPath.section].foodList[indexPath.row]
return cell
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return filteredFood[section].foodTaste
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return 4
}
}
公交车在排队
filteredFood = food.filter { [=10=].foodList.contains(where: { [=10=].contains(searchController.searchBar.text!) }) }
实际上你的 food
和 filteredFood
是一个二维数组。第一维是数组本身。第二个 - Food
对象内的内部数组 foodList
。此代码仅过滤此数据结构的外部维度。它说如果在 foodList
中有匹配搜索的字符串,那么整个 Food
对象应该通过过滤器。如果这不是您想要的 - 您还必须创建新的 Food
对象。大概是这样的:
filteredFood = food.filter { [=11=].foodList.contains(where: { [=11=].contains(searchController.searchBar.text!) }) }
.map { Food(foodTaste: [=11=].foodTaste, foodList: [=11=].foodList.filter( {[=11=].contains(searchController.searchBar.text!) }) }