在Swift中使用TextField在多分区TableView中进行搜索

3

我使用以下方法对文本字段进行搜索,在单个表格视图中使用时效果很好。

但是当表格视图中有多个部分时,我不知道如何实现这一点。

在普通的单节表格视图中

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

在多段式表格视图中:
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])
}

我正在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)
}

使用这个代码,它会将过滤后的字符串插入到areaArr数组的0号索引中。但是我需要它们应该在它们所属的章节中,并且章节名称应该是它们自己的,以及更改被过滤的字符串所属章节的索引。

例如,如果搜索文本是road,那么它应该是:

R.S puram (Section 1)
- Lawly Road
- D.B Road
Town Hall (Section 2)
- Five corner road

我的表格视图方法

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])"
}

我花了整整一天的时间,但还是没能解决问题,请帮忙修复……欢迎提出您的建议。


请添加您的正确的JSON数据,这样我们才能更好地指导您。您目前的格式不清晰。 - Er. Khatri
@Er.Khatri 我正在进行UI设计,所以我正在使用静态内容,您也可以建议保存和检索areaArr的值... - Abirami Bala
1
一开始我建议将数据存储在元组数组中,以便于进行后续操作,例如:var items = (section: String, elements: [String]) - Bence Pattogato
1个回答

3
您可以在shouldChangeCharactersIn方法中执行以下操作:
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"]

或者

     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"])]

numberOfSections 方法中,返回 searchResult.count

numberOfRowsInSection 方法中,返回 searchResult[section].1.count

在 titleForHeaderInSection 方法中,你可以使用:

return searchResult[section].0

在 cellForRowAt 方法中:
cell.textLabel?.text = "\(searchResult[indexPath.section].1[indexPath.row])"
该代码用于将搜索结果中对应位置的文本赋值给单元格的 textLabel 属性。

感谢您的回复。我在areaTitleResult行遇到了致命错误:索引超出范围。 - Abirami Bala
@AbiramiBala请确保areaTitles和areaArr的数量相同。 - RajeshKumar R
是的,两个计数都是相同的。 - Abirami Bala
什么是allDetails - NSMutableDictionary()...? - Abirami Bala
searchAreaArr = areaArr.map({ (areaTitle:$0.0,areas:$0.1.filter({ $0.lowercased().contains(substring) })) }).filter { !$0.1.isEmpty}我不太清楚这段代码是如何工作的...但很棒...谢谢。 - Abirami Bala
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接