Search code examples
iosuitableviewswift3uisearchbaruisearchbardelegate

image is not displayed correctly while loading cell with entries in searchbar iOS swift3


Here I am trying to display the filtered data results when the searching starts.The searching of the name works but I don't understand how to take the image with the search to display.I think the error is in filter content for search I'm new to iOS and any help will be appreciated

   import UIKit
    import Foundation
    import SDWebImage

    class TableViewController: UITableViewController,UISearchBarDelegate,UISearchResultsUpdating {
        //var sections = ["recent","old"]
        var TableData:Array<String> = Array <String>()
        //var TableDataRecent:Array<String> = Array <String>()
        var TableImage:Array<String> = Array <String>()
        var appoid:Array<String> = Array <String>()


        var filteredArray:[String]=[]
        var filteredImage:[String]=[]
        let searchController = UISearchController(searchResultsController:nil)


        override func viewDidLoad() {
            super.viewDidLoad()
            getData()
            self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cells")
            searchController.searchResultsUpdater = self
            searchController.dimsBackgroundDuringPresentation=false
            definesPresentationContext=true
            self.tableView.tableHeaderView = searchController.searchBar
            // Do any additional setup after loading the view, typically from a nib.
            tableView.reloadData()
        }

        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
        //
        //    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        //
        //        return sections[section]
        //
        //    }
        //
        //    override func numberOfSections(in tableView: UITableView) -> Int {
        //        // #warning Incomplete implementation, return the number of sections
        //
        //        return sections.count
        //
        //    }



        override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            if searchController.isActive && !searchController.searchBar.isEqual("") {
                return self.filteredArray.count
            }
            else{
                return TableData.count
            }
        }

        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            //here cells is the identifier name of prototype cell

            let cell = self.tableView.dequeueReusableCell(withIdentifier: "cells", for: indexPath)

            if searchController.isActive && !searchController.searchBar.isEqual(""){
                cell.textLabel?.text = filteredArray[indexPath.row]
                //cell.imageView?.image = filteredImage[indexPath.row]
    //            print("filteredimage")
    //            print(filteredImage)
    //            print(indexPath.row)
                cell.imageView?.sd_setImage(with: URL(string: TableImage[indexPath.row]), placeholderImage: UIImage(named: "PA"))
                print(TableData[indexPath.row])

                print(appoid[indexPath.row])
            }
            else{
                cell.textLabel?.text = self.TableData[indexPath.row]
                //cell.imageView?.image = self.TableImage[indexPath.row]
                cell.imageView?.sd_setImage(with: URL(string: TableImage[indexPath.row]), placeholderImage: UIImage(named: "PA"))
            //cell.= appoid[indexPath.row]

            }


        return cell
    }





    func filterContentForSearch(searchString:String){
        self.filteredArray=self.TableData.filter(){nil != $0.range(of:searchString)}
     self.filteredImage=self.TableImage.filter(){nil != $0.range(of:searchString)}

        self.tableView.reloadData()
    }


    func updateSearchResults(for searchController: UISearchController) {
        self.filterContentForSearch(searchString: searchController.searchBar.text!)
    }




    func getData() {


        var request = URLRequest(url: URL(string: "*********")!)
        //request.httpMethod = "POST"
        //let postString = "date="+x
        //request.httpBody = postString.data(using: .utf8)
        //print(request.httpBody)
        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            guard let data = data, error == nil else {                                                 // check for fundamental networking error
                print("error=\(error)")
                return
            }

            if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {           // check for http errors
                print("statusCode should be 200, but is \(httpStatus.statusCode)")
                print("response = \(response)")
            }

            let responseString = String(data: data, encoding: .utf8)
            print("responseString = \(responseString)")

            do{

                let json = try JSONSerialization.jsonObject(with: data, options:.allowFragments) as! [String:AnyObject]

                if let stations = json["result"] as? [[String: AnyObject]] {
                    for station in stations {
                        let name = station["patient_name"] as! String
                        //self.login = login_value
                        let profile_pic = station["image"] as! String
                        let status = station["status"] as! String

                        let appo_id = station["id"] as! String
                    //    let appo_id = station["appointment_id"] as! String
                        //let status = station["status"] as! String
                        //let appo_time = station["appointment_time"] as! String
                        //let appo_duration = station["time_duration"] as! String
                        //let reason = station["reason"] as! String
                        print(name,status)

                        self.TableData.append(name)
                        self.TableImage.append(profile_pic)
                        self.appoid.append(appo_id)

                    }







                    print(self.TableData)
                    print(self.TableImage)
                    //print(self.items)
                    //self.do_table_refresh();
                    self.tableView.reloadData()

                }

            }catch {
                print("Error with Json: \(error)")
            }



        }
        task.resume()



    }






}

Solution

  • Dont keep separate array for image, data and appoid. Create struct object and do the search on the struct object. Try this,

    import UIKit
       import Foundation
       import SDWebImage
    
       struct TableObject {
        var name: String = ""
        var image: String = ""
        var appoId: String = ""
       }
    
       class TableViewController: UITableViewController,UISearchBarDelegate,UISearchResultsUpdating {
        //var sections = ["recent","old"]
        var tableDataSource: [TableObject] = []
    
        var filteredArray: [TableObject] = []
        let searchController = UISearchController(searchResultsController:nil)
    
    
        override func viewDidLoad() {
            super.viewDidLoad()
            getData()
            self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cells")
            searchController.searchResultsUpdater = self
            searchController.dimsBackgroundDuringPresentation=false
            definesPresentationContext=true
            self.tableView.tableHeaderView = searchController.searchBar
            // Do any additional setup after loading the view, typically from a nib.
            tableView.reloadData()
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
        //
        //    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        //
        //        return sections[section]
        //
        //    }
        //
        //    override func numberOfSections(in tableView: UITableView) -> Int {
        //        // #warning Incomplete implementation, return the number of sections
        //
        //        return sections.count
        //
        //    }
    
    
    
        override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            if searchController.isActive && !searchController.searchBar.isEqual("") {
                return self.filteredArray.count
            }
            else{
                return tableDataSource.count
            }
        }
    
        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            //here cells is the identifier name of prototype cell
    
            let cell = self.tableView.dequeueReusableCell(withIdentifier: "cells", for: indexPath)
    
            if searchController.isActive && !searchController.searchBar.isEqual(""){
                cell.textLabel?.text = filteredArray[indexPath.row].name
                //cell.imageView?.image = filteredImage[indexPath.row]
                //            print("filteredimage")
                //            print(filteredImage)
                //            print(indexPath.row)
                cell.imageView?.sd_setImage(with: URL(string: filteredArray[indexPath.row].image), placeholderImage: UIImage(named: "PA"))
            }
            else{
                cell.textLabel?.text = self.TableData[indexPath.row]
                //cell.imageView?.image = self.TableImage[indexPath.row]
                cell.imageView?.sd_setImage(with: URL(string: tableDataSource[indexPath.row].image), placeholderImage: UIImage(named: "PA"))
                //cell.= appoid[indexPath.row]
    
            }
    
    
            return cell
        }
    
    
    
    
    
        func filterContentForSearch(searchString:String){
            self.filteredArray=self.tableDataSource.filter(){nil != $0.name.range(of:searchString)}
    
            self.tableView.reloadData()
        }
    
    
        func updateSearchResults(for searchController: UISearchController) {
            self.filterContentForSearch(searchString: searchController.searchBar.text!)
        }
    
    
    
    
        func getData() {
    
    
            var request = URLRequest(url: URL(string: "*********")!)
            //request.httpMethod = "POST"
            //let postString = "date="+x
            //request.httpBody = postString.data(using: .utf8)
            //print(request.httpBody)
            let task = URLSession.shared.dataTask(with: request) { data, response, error in
                guard let data = data, error == nil else {                                                 // check for fundamental networking error
                    print("error=\(error)")
                    return
                }
    
                if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {           // check for http errors
                    print("statusCode should be 200, but is \(httpStatus.statusCode)")
                    print("response = \(response)")
                }
    
                let responseString = String(data: data, encoding: .utf8)
                print("responseString = \(responseString)")
    
                do{
    
                    let json = try JSONSerialization.jsonObject(with: data, options:.allowFragments) as! [String:AnyObject]
    
                    if let stations = json["result"] as? [[String: AnyObject]] {
                        for station in stations {
                            let name = station["patient_name"] as! String
                            //self.login = login_value
                            let profile_pic = station["image"] as! String
                            let status = station["status"] as! String
    
                            let appo_id = station["id"] as! String
                            //    let appo_id = station["appointment_id"] as! String
                            //let status = station["status"] as! String
                            //let appo_time = station["appointment_time"] as! String
                            //let appo_duration = station["time_duration"] as! String
                            //let reason = station["reason"] as! String
                            print(name,status)
                            let tableData = TableObject(name: name, image: profile_pic, appoId: appo_id)
                            self.tableDataSource.append(tableData)
    
                        }
                        //print(self.items)
                        //self.do_table_refresh();
                        self.tableView.reloadData()
    
                    }
    
                }catch {
                    print("Error with Json: \(error)")
                }
    
            }
            task.resume()
        }
    
       }