用 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

titleForHeaderInSection 与 UISearch 字段重叠

两个 NSMutables 数组中的 UISearch 栏

UISearch 栏总是显示:没有结果

IOS RxSwift中UISearch栏文本和视图模型属性之间的两种方式绑定