代码之家  ›  专栏  ›  技术社区  ›  user7225129

搜索栏不会过滤数据

  •  2
  • user7225129  · 技术社区  · 7 年前

    我试图使用搜索栏过滤我获取的JSON数据。然而,当我在搜索栏中键入内容时,它什么也不做。数据仍然在同一个位置,并且没有被过滤,但是当我在搜索栏中键入内容时,应该对其进行动态过滤。

    下面的代码显示了我的TableViewController以及将JSON数据提取到数组中的函数。然后使用搜索栏对其进行过滤,每当数据的名称与搜索栏中的条件匹配时,就会将其添加到第二个名为“filteredExercise”的数组中。

    import UIKit
    
    class ExerciseTableViewController: UITableViewController, UISearchBarDelegate {
    
    var fetchedExercise = [Exercise]()
    var filteredExercise = [Exercise]()
    var inSearchMode = false
    
    @IBOutlet var searchBar: UITableView!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        searchBar.delegate = self
    
        parseData()
    
    }
    
    
    func parseData() {
    
        fetchedExercise.removeAll()
    
        let urlPath = "https://wger.de/api/v2/exercise/?format=json&language=2&status=2&limit=200"
        let url = URL(string: urlPath)!
    
        let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
    
            if error != nil {
                print("Error while parsing JSON")
            }
            else {
    
                do {
                    if let data = data,
                        let fetchedData = try JSONSerialization.jsonObject(with: data, options: .mutableLeaves) as? [String:Any],
                        let exercises = fetchedData["results"] as? [[String: Any]] {
    
    
                        for eachExercise in exercises {
                            if eachExercise["license_author"] as! String == "wger.de" {
                                let name = eachExercise["name"] as! String
                                let description = eachExercise["description"] as! String
                                let id = eachExercise["id"] as! Int
    
                                self.fetchedExercise.append(Exercise(name: name, description: description, id: id))
                            }
                        }
    
    
                        DispatchQueue.main.async {
                            self.tableView.reloadData()
                        }
                    }
                }
                catch {
                    print("Error while parsing data.")
                }
            }
        }
        task.resume()
    }
    
    
    
    // MARK: - Table view data source
    
    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
    
        if inSearchMode {
    
            return filteredExercise.count
        }
    
        return fetchedExercise.count
    }
    
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if let cell = tableView.dequeueReusableCell(withIdentifier: "ExerciseCell", for: indexPath) as? ExerciseCell {
    
            let exercise: Exercise!
    
            if inSearchMode {
    
                exercise = filteredExercise[indexPath.row]
                cell.configureCell(exercise: exercise)
    
            } else {
    
                exercise = fetchedExercise[indexPath.row]
                cell.configureCell(exercise: exercise)
            }
    
            return cell
    
        } else {
    
            return UITableViewCell()
        }
    
    
    }
    
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    
    
        var exercise: Exercise!
    
        exercise = fetchedExercise[indexPath.row]
    
        performSegue(withIdentifier: "exerciseDetailVC", sender: exercise)
    }
    
    
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    
        if searchBar.text == nil || searchBar.text == "" {
    
            inSearchMode = false
            self.tableView.reloadData()
    
        } else {
    
            inSearchMode = true
    
            let lower = searchBar.text!.lowercased()
    
            filteredExercise = fetchedExercise.filter({$0.name.range(of: lower) != nil})
            self.tableView.reloadData()
        }
    }
    
    
    
    }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   SergStav    7 年前

    看起来你在中出错了?

    @IBOutlet var searchBar: UITableView!
    

    我认为它应该是UISearchBarController类型。

        2
  •  0
  •   user7225129 user7225129    7 年前

    好的,我终于找到了问题所在。

    然后我不得不将我的IBOutlet连接到故事板,因为它还没有完成。 最后,在筛选数据时,我开始得到错误的结果,这是因为我一直在使用小写()函数筛选结果,而我的所有数据都是大写的。