Search using TextFiled in Multi Sectioned TableView - Swift
I did a search with a textbox using the method below and it works great when I use a separate section in a table view.
But I don't know how to achieve this when I have multiple sections in the View table
In a normal single cut tableview
foodTypeArr = ["Japanesh", "Chinesh", "Lebanesh", "Italian", "Indian"]
searchResultArr.addObjects(from: foodTypeArr as! [Any])
func searchAutocompleteEntriesWithSubstring(substring: String)
{
searchResultArr.removeAllObjects()
for curString in foodTypeArr
{
let myString:NSString! = curString as! NSString
if (myString).lowercased.contains(substring)
{
searchResultArr.add(curString)
}
}
self.tblList.reloadData()
}
In Multi Section TableView
var searchAreaArr = NSMutableArray()
var areaArr = [[String]]()
var areaTitles = NSArray()
areaArr = [["Vadvalli", "Mullai Nagar", "P.N.Pudhur"], ["Lawly Road", "Kowly Brown", "D.B Road"], ["Raja Street", "Gandhipark", "Five corner road", "Main Town Hall"]]
areaTitles = ["Vadavalli", "R.S.Puram", "Town Hall"]
for i in 0..<areaArr.count
{
searchAreaArr.addObjects(from: areaArr[i])
}
I am calling below method on TextField-shouldChangeCharactersIn
func searchAutocompleteEntriesWithSubstring(substring: String)
{
areaArr.removeAll()
var mArr = [String]()
for curString in searchAreaArr
{
let myString:NSString! = curString as! NSString
if (myString).lowercased.contains(substring)
{
mArr.append(curString as! String)
}
}
areaArr.insert(mArr, at: 0)
}
with this, it inserts the filtered rows into the 0th Index array in areaArr . But I need it to be on their sections, and the section title should be their own, and change the "Index of Filtered Row Sections"
Say For example, if the search text is expensive , it should be
R.S puram (Section 1)
- Lawly Road
- D.B Road
Town Hall (Section 2)
- Five corner road
My table view methods
func numberOfSections(in tableView: UITableView) -> Int
{
return areaArr.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return areaArr[section].count
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?
{
if section < areaTitles.count
{
return areaTitles[section] as? String
}
return nil
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell:UITableViewCell =
self.tblList.dequeueReusableCell(withIdentifier: "cell") as UITableViewCell!
cell.textLabel?.text = "\(areaArr[indexPath.section][indexPath.row])"
}
I lost one day with him, please help fix this .... Your suggestions are welcome
source to share
You can do something like this in the shouldChangeCharactersIn method
let areaArr = [["Vadvalli", "Mullai Nagar", "P.N.Pudhur"], ["Lawly Road", "Kowly Brown", "D.B Road"], ["Raja Street", "Gandhipark", "Five corner road", "Main Town Hall"]]
let areaTitles = ["Vadavalli", "R.S.Puram", "Town Hall"]
let searchText = "road"
var areaArrResult = areaArr.map { $0.filter({ $0.lowercased().contains(searchText) }) }
let areaTitlesResult = areaTitles.filter { !areaArrResult[areaTitles.index(of: $0)!].isEmpty }
areaArrResult = areaArrResult.filter { !$0.isEmpty }
print(areaArrResult)//[["Lawly Road", "D.B Road"], ["Five corner road"]]
print(areaTitlesResult)//["R.S.Puram", "Town Hall"]
OR
var allDetails:[(String,[String])] = []
var searchResult:[(String,[String])] = []
allDetails = [("Vadavalli",["Vadvalli", "Mullai Nagar", "P.N.Pudhur"]),
("R.S.Puram",["Lawly Road", "Kowly Brown", "D.B Road"]),
("Town Hall",["Raja Street", "Gandhipark", "Five corner road", "Main Town Hall"])]
searchAreaArr = areaArr.map({ ($0.0,$0.1.filter({ $0.lowercased().contains(substring) })) }).filter { !$0.1.isEmpty}
print(searchResult)//[("R.S.Puram", ["Lawly Road", "D.B Road"]), ("Town Hall", ["Five corner road"])]
Then in numberOfSections
return searchResult.count
IN numberOfRowsInScetion
return searchResult[section].1.count
In titleForHeaderInSection method, you can use
return searchResult[section].0
In cellForRowAt method
cell.textLabel?.text = "\(searchResult[indexPath.section].1[indexPath.row])"
source to share