如何使 search/filtered 结果在 Tableview 的顶部?

How to make search/filtered result on the top of Tableview?

我正在制作一个信息应用程序,它在 table 视图上有部分和行。 tableView 顶部有一个 searchBar 来过滤名称但是当我搜索名称时,相应的名称显示为每个数组但我希望搜索结果应该在 tableView 的顶部.

我在搜索栏委托 textDidChange 中使用了一些过滤器,但它没有达到我预期的效果。

例如:我正在搜索“kumar”,根据我们的数据,它位于第 3 行。但我希望它位于 table.

的顶部

解决问题的原因:如果该部分中有很多行并且名称以“Z”开头。它一直到 tableView

我对 swift、Xcode、UIKit 很陌生。

型号:

struct Datas {
    var sectionName: String
    var shops: [Detail1]        
}

struct Detail1 {   
    var name: String
    var contact: [String]
    var address: [String]
}

数据:

var data1 = [
    Datas(sectionName: "A", shops: [
        Detail1(name: "raj", contact: ["454545" ], address: ["KNR" ]),
        Detail1(name: "bala", contact: ["878787"], address: ["NGI"]),
        Detail1(name: "raja", contact: ["212121"], address: ["CHN"])
    ]),    
    Datas(sectionName: "B", shops: [
        Detail1(name: "balaji", contact: ["9898898"], address: ["KNR"]),
        Detail1(name: "Siva", contact: ["787878"], address: ["LKD"]),
        Detail1(name: "Kumar", contact: ["2323232"], address: ["MNR"])
    ])
]
extension ViewController: UISearchBarDelegate {
    
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
       
        filteredData = []
        
        if searchText == "" {
            
            filteredData = data1
            
            tableView.reloadData()
            
            DispatchQueue.main.async {
                searchBar.resignFirstResponder()
            }
            
        } else {
            
            for word in data1 {
                
                if word.shops.contains(where: {[=13=].name.lowercased().prefix(searchText.count) == searchText.lowercased()}) ||
                    word.sectionName.lowercased().prefix(searchText.count) == searchText.lowercased()
                {
                    filteredData.append(word)
                }
            }
            tableView.reloadData()
            
        }
    }

我认为你的问题在于你只过滤部分而你应该过滤项目:

filteredData = data1.compactMap { section in
  if section.sectionName.lowercased().hasPrefix(searchText.lowercased()) {
     // return whole section
     return section
  }

  let filteredShops = section.shops.filter { [=10=].name.lowercased().hasPrefix(searchText.lowercased()) }

  guard !filteredShops.isEmpty {
     // no match in the given section
     return nil
  }

  // return an updated section with filtered shops
  return Datas(sectionName: section.sectionName, shops: filteredShops)
}