0

I have a class that holds the data coming from my api

class Shops {
    private var _familiy_id: String?
    private var _logo : String?
    private var _shopname : String?


    var familiy_id : String{
        return _familiy_id!
    }

    var shopname : String{
        return _shopname!
    }
    var Logo : String{
        return _logo!
    }

    init(shopname : String , Logo : String , family_id : String) {        
        self._shopname = shopname
               self._logo = Logo
        self._familiy_id = family_id        
    }
}

I'm trying to filter the name of the shops and splay it if users edit the search bar. SO I tried this code :

var searchActive : Bool = false
var filtered:[Shops] = []
var shops = [Shops]()

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {       
    filtered = searchText.isEmpty ? shops : shops.filter { (item: String) -> Bool in
        // If dataItem matches the searchText, return true to include it
        return item.range(of: searchText, options: .caseInsensitive, range: nil, locale: nil) != nil
    }        
    tableView.reloadData()
}

but I get an error saying that item has no member range! Sorry this is my first time to implement UISearchBar in my project so I'm trying to learn from other code

AlmoDev
  • 969
  • 2
  • 18
  • 46

1 Answers1

0

check out this link How to implement UISearchController in UITableView - SWIFT and add your code in this function func updateSearchResults(for searchController: UISearchController)
try this:

// MARK: UISearchResultsUpdating delegate function
// example for search user in userlist and change it as your requirements. 
func updateSearchResults(for searchController: UISearchController) {
    guard let searchString = searchController.searchBar.text else {
        return
    }

    // Filter the data array and get only those userlist that match the search text.
    filteredArray = self.userList.filter{
        let firstName = $0.first_name.lowercased()
        let middleName = $0.middle_name.lowercased()
        let lastName = $0.last_name.lowercased()
        let contactNumber = $0.mobile.lowercased()
        let fullName = $0.fullname.lowercased()

        return firstName.range(of: searchString.lowercased()) != nil
            || middleName.range(of: searchString.lowercased()) != nil
            || lastName.range(of: searchString.lowercased()) != nil
            || contactNumber.range(of: searchString.lowercased()) != nil
            || fullName.range(of: searchString.lowercased()) != nil
    }
    // Reload the tableview.
    tableView.reloadData()
}

Hope this might help you out

Yuyutsu
  • 2,509
  • 22
  • 38
  • Thank you for your response. The issue is I don't know how to make the shops' names in an array for the filter. So far it's in the array as Data – AlmoDev Aug 10 '17 at 21:03
  • `let filteredArray = shops.filter{ let shopname = $0.shopname.lowercased() return shopname.range(of: searchString.lowercased()) != nil}` Did you try above code? It will help you out, please try it. – Yuyutsu Aug 11 '17 at 04:26