0

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()



    }






}
Keyur
  • 180
  • 1
  • 5
  • 20
SHINTO JOSEPH
  • 377
  • 4
  • 17

2 Answers2

1

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()
    }

   }
Venk
  • 5,949
  • 9
  • 41
  • 52
1

Follow these

Dont make separate array :

 let arrData = [Any]() // these combined array

Change while get data

if let stations = json["result"] as? [[String: AnyObject]] {
                        for station in stations {
                            arrData.append(station)
                        }

Changes on TableViewDatasource

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            if searchController.isActive && !searchController.searchBar.isEqual("") {
                return self.filteredArray.count
            }
            else{
                return arrData.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(""){
                     let dictObjects = filteredArray[indexPath.row] as [String: AnyObject]
                  cell.textLabel?.text = dictObjects["name"]
              cell.imageView?.sd_setImage(with: URL(string:  dictObjects["image"]), placeholderImage: UIImage(named: "PA"))
        }
        else{
        let dictObjects = arrData[indexPath.row] as [String: AnyObject]

            cell.textLabel?.text = dictObjects["name"]
            cell.imageView?.sd_setImage(with: URL(string:  dictObjects["image"]), placeholderImage: UIImage(named: "PA"))
        //cell.= appoid[indexPath.row]

        }

    return cell
}

Filter using this

let namePredicate = NSPredicate(format: "name like %@","yourstring");
filteredArray = arrData.filter { namePredicate.evaluate(with: $0) };
print("names = ,\(filteredArray)");
KKRocks
  • 8,222
  • 1
  • 18
  • 84