我已经实现了SearchController
,当我使用SearchController
搜索食物项目时,它会返回整个部分。
例如,我将使用Chocolate
搜索SearchController
,它会返回并导致tableView显示Sweets
的整个部分,而不只是Chocolate
,它也将返回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 { $0.foodList.contains(where: { $0.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
}
}
答案 0 :(得分:1)
巴士在行
filteredFood = food.filter { $0.foodList.contains(where: { $0.contains(searchController.searchBar.text!) }) }
有效地,您的food
和filteredFood
是一个二维数组。第一个维度是数组本身。第二个 - foodList
对象内部的内部数组Food
。此代码仅过滤此数据结构的外部维度。它表示如果有一个字符串与foodList
内的搜索匹配,那么整个Food
对象应该通过过滤器。如果这不是您想要的 - 您还必须创建新的Food
对象。可能是这样的:
filteredFood = food.filter { $0.foodList.contains(where: { $0.contains(searchController.searchBar.text!) }) }
.map { Food(foodTaste: $0.foodTaste, foodList: $0.foodList.filter( {$0.contains(searchController.searchBar.text!) }) }