1

If I use simple array in UISearchBar, it is working fine.

But when I use Multidimensional Array in UISearchBar , it is not working.

My code is bellow

 class ViewController: UIViewController  ,UITableViewDelegate,UITableViewDataSource,UISearchBarDelegate{

  @IBOutlet weak var seachBar: UISearchBar!

  @IBOutlet weak var tableView: UITableView!

  var serachingArray = [[String:AnyObject]]();
  var seraching:Bool = false
   var originalArray = [
    ["name":"Enamul Haque" as AnyObject ,"address":"28 top kana" as AnyObject],
    ["name":"Raque" as AnyObject ,"address":"39 Alo kana" as AnyObject],
    ["name":"Enamul" as AnyObject ,"address":"D/28 kana" as AnyObject]
]


 override func viewDidLoad() {
    super.viewDidLoad()
    tableView.delegate = self
    tableView.dataSource = self
    seachBar.delegate = self

 }


 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
     if(seraching == true){
        return serachingArray.count
      }else{
         return originalArray.count
      }
  }

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! CustomCell
      if(seraching == true){
        cell.tv_name.text =  serachingArray[indexPath.row]["name"] as! String
      }else{
         cell.tv_name.text =  originalArray[indexPath.row]["name"] as! String

     }
    return cell
}

  func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
      print("searchText",searchText)
       serachingArray = originalArray.filter({ (text) -> Bool in
        let temp:NSString = text as! NSString
        var range = temp.range(of: searchText,options:NSString.CompareOptions.caseInsensitive)
        return range.location != NSNotFound

    })

       if(serachingArray.count == 0){
          seraching = false
      }else{
         seraching = true
       }
        self.tableView.reloadData();
      }
 }

How to assign original array to search array? Please suggest .

Enamul Haque
  • 4,789
  • 1
  • 37
  • 50
  • Possible duplicate of [Filter data from array of Dictionary using predicate iOS SDK](https://stackoverflow.com/questions/45026796/filter-data-from-array-of-dictionary-using-predicate-ios-sdk) – karthikeyan Jul 11 '17 at 07:09
  • 1
    Not related to your question but you could also just use `if searching { }` instead of `if (searching == true)` or maybe `return searching ? searchingArray.count : originalArray.count` – Mahbub Morshed Dec 31 '17 at 12:35
  • Thank you @Mahbub Morshed Prottoy – Enamul Haque Dec 31 '17 at 12:39

2 Answers2

1

try This:-

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        print("searchText",searchText)
        serachingArray = self.originalArray.filter({(($0["name"] as! String).localizedCaseInsensitiveContains(searchText))!})

        if(serachingArray.count == 0){
            seraching = false
        }else{
            seraching = true
        }
        self.tableView.reloadData();
}
Irshad Ahmad
  • 1,363
  • 11
  • 17
0

try replacing the textDidChange code with the given code

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
   serachingArray = originalArray.filter {
      return $0["name"]!.caseInsensitiveCompare(searchText) == .orderedSame
   }
   ... remaining code
}

change originalArray values as strings no need to declare them as AnyObject if you are using swift

var originalArray = [
    ["name":"Enamul Haque","address":"28 top kana"],
    ["name":"Raque","address":"39 Alo kana"],
    ["name":"Enamul","address":"D/28 kana"]
]

var serachingArray = [[String: Any]]()
Suhit Patil
  • 11,748
  • 3
  • 50
  • 60