用 UITableView 实现 UISearchBar
Posted
技术标签:
【中文标题】用 UITableView 实现 UISearchBar【英文标题】:Implementing UISearchBar with UITableView 【发布时间】:2020-04-18 01:20:58 【问题描述】:所以我有一个应用程序,它允许用户从 tableview 的列表中选择电影(由 api 填充),点击电影会呈现一个包含更多细节的视图。我想实现一个搜索栏,以便用户可以搜索特定的电影,但是我遇到了一些麻烦
我假设下面的函数可以让下面的 tableview 可以搜索电影
var newMovies: [NSDictionary] = []
...
func searchBar()
let searchBar = UISearchBar(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 50))
searchBar.delegate = self
searchBar.showsScopeBar = true
searchBar.tintColor = UIColor.lightGray
self.tableView.tableHeaderView = searchBar
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String)
if searchText == ""
fetchMovies()
else
if searchBar.selectedScopeButtonIndex == 0
newMovies = newMovies.filter( (NSDictionary) -> Bool in
return NSDictionary.lowercased().contains(searchText.lowercased())
)
else
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return newMovies.count
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "MovieCell", for: indexPath) as! MovieSearchTableViewCell
let movie = newMovies[indexPath.row]
let title = movie["title"] as! String
let overview = movie["overview"] as! String
cell.titleLabel.text = title
cell.overviewLabel.text = overview
但是,这会出现 2 个错误;
return NSDictionary.lowercased().contains(searchText.lowercased())
“任何”类型的值没有“包含”成员
“NSDictionary”类型的值没有“小写”成员
我应该返回 NSDictionary 以外的东西吗?
【问题讨论】:
你的电影模型对象是什么样的?您的未经过滤的电影在哪里?它们长什么样? @Rob 没有未过滤的电影 过滤后的电影变量是对代码进行了一些不良实验的结果,我更新了变量名称以反映这一点,我不确定您所说的电影模型是什么意思对象 啊,我明白了,您只是在使用字典来表示您的电影。我假设fetchMovies
只是将 newMovies 数组重置为其原始值?
@Rob 基本上,是的,fetchMovies
创建了一个 URLRequest 来获取 JSON 数据并将其分配给字典,也就是说是否可以通过这种方式实现搜索功能?跨度>
您可以这样做,但效率低下。提示:使用两个数组,一个用于搜索模式,一个用于非搜索模式。使用布尔标志表示您处于搜索模式。
【参考方案1】:
假设您正在搜索匹配的标题,您希望这样做:
newMovies = newMovies.filter( movie in
guard let title = movie["title"] as? String else return false
return title.lowercased().contains(searchText.lowercased())
)
【讨论】:
以上是关于用 UITableView 实现 UISearchBar的主要内容,如果未能解决你的问题,请参考以下文章
UIViewController 内带有 UITableView 的搜索栏
如何从 Appdelegate 方法 applicationWillEnterForeground 重置 UISearch