user7225129
user7225129

Reputation:

data is not filtered by the searchbar

I am trying to filter my fetched JSON data using a searchbar. However, when I type something into the searchbar it does nothing. Data is still in the same place and it is not filtered, whereas it should be dynamically filtered while I am typing something into the searchbar.

The code below shows my TableViewController as well as the function for fetching JSON data into my array. It is then filtered using a searchbar and whenever the data's name is matching the condition in the search bar it is then added to the second array called '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()
    }
}



}

Upvotes: 2

Views: 59

Answers (2)

user7225129
user7225129

Reputation:

Okay, I have finally figured out what is wrong with it.

Basically first of all I had incorrect type for my searchBar due to the Xcode bug and I did not see that. Then I had to connect my IBOutlet to the storyboard as well because it was not done. Finally I started getting wrong results while filtering through the data and it was because I have been filtering through results using a lowercased() function, whereas all my data is capitalized.

Upvotes: 0

SergStav
SergStav

Reputation: 757

Looks like you have an error in?

@IBOutlet var searchBar: UITableView!

I think it should be type of UISearchBarController.

Upvotes: 1

Related Questions