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