search bar in ios swift

30,844

Solution 1

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UISearchBarDelegate {

    @IBOutlet var tblview: UITableView!
    @IBOutlet var searchview: UISearchBar!

    var data:[String] = ["Dev","Hiren","Bhagyashree","Himanshu","Manisha","Trupti","Prashant","Kishor","Jignesh","Rushi"]

    var filterdata:[String]!

    override func viewDidLoad() {

        super.viewDidLoad()
        tblview.dataSource = self
        searchview.delegate = self
        filterdata = data
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return filterdata.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    {

        let cell = tblview.dequeueReusableCell(withIdentifier: "cell", for: indexPath)as!TableViewCell1

        if filterdata.count != 0
        {
            cell.textview.text = filterdata[indexPath.row]
        }
        else{
            cell.textview.text = data[indexPath.row]
        }

        return cell
    }

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

            // filterdata  = searchText.isEmpty ? data : data.filter {(item : String) -> Bool in

            filterdata = searchText.isEmpty ? data : data.filter { $0.contains(searchText) }

            //return item.range(of: searchText, options: .caseInsensitive, range: nil, locale: nil) != nil

        tblview.reloadData()               
    }

Solution 2

let searchController = UISearchController(searchResultsController: nil)
navigationItem.hidesSearchBarWhenScrolling = true
navigationItem.searchController = searchController
Share:
30,844
Admin
Author by

Admin

Updated on July 09, 2022

Comments

  • Admin
    Admin almost 2 years

    I want to use search bar in my app.I am trying to use it but exceptions are coming . I have got an array of dictionary called member [[String:Anyobject]] and from this i have taken out the name and stored into an array data of type string and it is not working.

    Here is my code :

    import UIKit
    
    class hcbaViewController: UIViewController,UITableViewDataSource,UITableViewDelegate,UISearchBarDelegate {
    
    @IBOutlet var searchbar: UISearchBar!
    
    @IBOutlet var tableview: UITableView!
    
    var member = [[String:AnyObject]]()
    
    var members = [String:AnyObject]()
    
    var searchActive = true
    var filtered:[String] = []
    var data: [String] = []
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        print(data)
        print("________-----------________----------")
     print(member)
    
    
        // Do any additional setup after loading the view.
    }
    
    func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
        searchActive = true
    }
    
    func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
        searchActive = false
    }
    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
        searchActive = false
    }
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        searchActive = false
    }
    
    
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    
        filtered = data.filter({ (text) -> Bool in
            let tmp:NSString = text as NSString
            let range = tmp.range(of: searchText, options: NSString.CompareOptions.caseInsensitive)
            return range.location != NSNotFound
        })
    
        if (filtered.count == 0){
            searchActive = false
        }
        else{
            searchActive = true
        }
        self.tableview.reloadData()
    }
    
     func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    
        return "MemberDirectory"
    
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    
        return member.count
    
       if(searchActive){
           return filtered.count
        }
     else{
            return data.count
        }
    
       // return member.count
    
    }
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
        let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell",for: indexPath)
    
         var display = member[indexPath.row]
    
        cell.textLabel?.text = display["Name"] as! String?
        cell.detailTextLabel?.text = display["email"] as? String
    
    
        let n = display["Name"] as! String
         data.append(n)
    
        return cell
    }
    
    
      override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    
            let vc = segue.destination as! hcbadetailViewController
            vc.kk = members
    
    }
    
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    
           members = member[indexPath.row]
           self.performSegue(withIdentifier: "bye", sender: nil)
    }