在多节表视图中使用文本字段进行搜索 - Swift

Posted

技术标签:

【中文标题】在多节表视图中使用文本字段进行搜索 - Swift【英文标题】:Search using TextFiled in Multi Sectioned TableView - Swift 【发布时间】:2017-06-07 11:47:21 【问题描述】:

我使用以下方法对文本字段进行了搜索,当我在表格视图中使用单个部分时,它工作正常。

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

在普通单节表格视图中

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 range 中调用下面的方法

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 我在做 UI 所以我在做静态内容,你也可以建议保存和检索 areaArr 的值...... 首先我建议将您的数据存储在一个 touple 数组中,以使您的进一步工作更容易,例如: var items = [(section: String, elements: [String])]()跨度> 【参考方案1】:

你可以在 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"])]

然后 在numberOfSectionsreturn searchResult.count

numberOfRowsInScetionreturn searchResult[section].1.count

在titleForHeaderInSection方法中可以使用

return searchResult[section].0

在 cellForRowAt 方法中

cell.textLabel?.text = "\(searchResult[indexPath.section].1[indexPath.row])"

【讨论】:

感谢您的回复。我遇到致命错误:areaTitleResult 行中的索引超出范围 @AbiramiBala 确保 areaTitles 的计数和 areaArr 的计数相同。 是的,两个计数相同 什么是allDetails - NSMutableDictionary() ...? @AbiramiBala 它是元组数组。检查这个link

以上是关于在多节表视图中使用文本字段进行搜索 - Swift的主要内容,如果未能解决你的问题,请参考以下文章

具有多个文本字段输入视图的多个选取器视图 Swift

在多节 UITableView 中添加行时崩溃

Swift:数组、文本字段和 UITableView

从表格视图单元格中收集文本字段文本 (Swift)

如何在同一个视图控制器上分割文本字段(swift 3)

swift 键盘粘贴到文本字段使用输入附件视图