0

I have a problem with the search bar, when I load the app the Json data is loaded correctly in the table view, but if I enter a word in the search field nothing happens, the data is not searched and the tableView remains the same.

ViewController

import UIKit


class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    

    var popularMoviesArray = [Results]()

    var swiftManager = SwiftManager()

    var tableViewCell = TableViewCell()

    @IBOutlet weak var tableView: UITableView!
    
    // START SEARCHBAR
    
    @IBOutlet weak var searchBar: UISearchBar!
    @IBOutlet weak var labelError: UILabel!
    
    var filteredMoviesArray = [Results]() {

        didSet {
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        }
        
    }
    
    // END SEARCHBAR
    
   override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self

        swiftManager.delegate = self
    
    // START SEARCHBAR
    
    searchBar.delegate = self
    searchBar.placeholder = "Search here..."
    
    // END SEARCHBAR
    
    swiftManager.fetchUrl()
        
    }
    
    // START SEARCHBAR
    
    func rowOk() {
        labelError.backgroundColor = UIColor.white
        labelError.text = ""
    }
    func rowError() {
        labelError.textColor = UIColor.white
        labelError.backgroundColor = UIColor.red
        labelError.textAlignment = .center
        labelError.text = "no records found"
    }
    
    // END SEARCHBAR

    
    // MARK: - TableView Datasource Methods

    func numberOfSections(in tableView: UITableView) -> Int {
        
        return 1
        
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        // START SEARCHBAR

        if filteredMoviesArray.count != 0 {
            rowOk()
            print("OK - \(filteredMoviesArray.count)")
            return filteredMoviesArray.count
        } else {
            rowError()
            print("ERROR - \(filteredMoviesArray.count)")
            return filteredMoviesArray.count
        }
        
        // END SEARCHBAR
        
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
        
        let item = filteredMoviesArray[indexPath.row]
        
        cell.labelTitle.text = item.title
        cell.labelYear.text = labelYearFormatter
        cell.labelRate.text = String(item.vote_average ?? 0.0)
        cell.labelOreview.text = item.overview
        
        return cell
        
    }
    
    // MARK: - TableView Delegate Methods
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        
        performSegue(withIdentifier: "goToDetail", sender: indexPath.row)
        
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        
        guard segue.identifier != nil else {
            return
        }
        
        let letRow = sender as? Int
        
        switch segue.identifier {

        case "goToDetail":

        (segue.destination as! ViewControllerDetail).itemDetail = filteredMoviesArray[letRow!]
        
        default:

            return
        }
        
        
    }



}

extension SwiftManagerDelegate

//MARK: - SwiftManagerDelegate

 extension ViewController: SwiftManagerDelegate {
    
   func didUpdateStruct(_ swiftManager: SwiftManager, swiftData: SwiftData) {
        
       DispatchQueue.main.async {
            
            self.filteredMoviesArray = swiftData.results
            
            self.tableView.reloadData()
            
        }
        
    }
    
    
    func didFailWithError(error: Error) {
        print(error)
    }
    
}

extension UISearchBarDelegate

//MARK: - UISearchBarDelegate

 // START SEARCHBAR

 extension ViewController: UISearchBarDelegate {
    
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        
        guard
            let searchText = searchBar.text
        else {
            return
        }
        
        if searchText.isEmpty == true {
            
            func didUpdateStruct(_ swiftManager: SwiftManager, swiftData: SwiftData) {
                
                DispatchQueue.main.async {
                    
                    self.filteredMoviesArray = swiftData.results
                    
                    self.tableView.reloadData()
                    
                }
                
            }
            
            print("EMPTY")
            return

        } else {
            
            func didUpdateStruct(_ swiftManager: SwiftManager, swiftData: SwiftData) {
                
                DispatchQueue.main.async {
                    
                    self.filteredMoviesArray = swiftData.results.filter {
                        $0.title!.uppercased().contains(searchText.uppercased())
                    }
                    
                    self.tableView.reloadData()
                    
                }
                
            }
            
            print("FULL")
            return
            
        }
        
        
    }
    
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        
        searchBar.text = ""
        
        swiftManager.fetchUrl()
        
    }
    
}

// END SEARCHBAR
SwiftLove
  • 31
  • 1
  • 6

0 Answers0