【问题标题】:Implementing UISearchBar with UITableView用 UITableView 实现 UISearchBar
【发布时间】: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 数据并将其分配给字典,也就是说是否可以通过这种方式实现搜索功能?跨度>
  • 您可以这样做,但效率低下。提示:使用两个数组,一个用于搜索模式,一个用于非搜索模式。使用布尔标志表示您处于搜索模式。

标签: swift uitableview uisearchbar uisearchbardelegate


【解决方案1】:

假设您正在搜索匹配的标题,您希望这样做:

newMovies = newMovies.filter({ movie in
    guard let title = movie["title"] as? String else { return false }
    return title.lowercased().contains(searchText.lowercased())
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多