UISearchController 返回部分而不是过滤的 tableview 项
Posted
技术标签:
【中文标题】UISearchController 返回部分而不是过滤的 tableview 项【英文标题】:UISearchController returns section instead of the filtered tableview item 【发布时间】:2017-12-20 17:01:12 【问题描述】:我已经实现了SearchController
,当我使用SearchController
搜索食物时,它会返回整个部分。
例如,我将使用SearchController
搜索Chocolate
,它会返回并导致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
【问题讨论】:
【参考方案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!) )
【讨论】:
以上是关于UISearchController 返回部分而不是过滤的 tableview 项的主要内容,如果未能解决你的问题,请参考以下文章
使用 UISearchController 显示搜索结果和键盘覆盖 UITableView 中的底部行/部分
带有 UISearchController 的 UITableView 在进入结果视图并返回时进入导航栏
为啥我的 UITableView 滚动偏移在返回其视图时最终落在 UISearchController 后面?
使用ios 8 UISearchController单击搜索栏时如何隐藏部分标题?
UISearchController:UITableView 的 Section Index 与 searchBar 重叠