如何使 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)
}
我正在制作一个信息应用程序,它在 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)
}