在 Swift 中搜索表视图数据并处理行选择
Search through tableview data and handle row selection in Swift
我在从表视图中搜索数据时遇到问题。我想从 tableview 中搜索数据,但在搜索时卡住了。以下是我尝试过的代码。我遇到的问题是 无法将类型“[Employee]”的值分配给类型“[String]” 请帮忙。 TIA
var empList: [Employee]!
var searchedText = [String]()
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if searching {
return searchedText.count
} else {
return empList?.count ?? 0
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CustomCell
if searching {
cell.lblTitle.text = searchedText[indexPath.row]
}else {
let resObjects = empList?[indexPath.row]
cell.lblTitle.text = resObjects?.emp_name
}
return cell
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
searchedText = empList.filter{[=11=].emp_name?.contains(searchText)}
// The above line gives me error as, cannot assign value of type '[Employee]' to type '[String]'
searching = true
tableView.reloadData()
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
searching = false
searchBar.text = ""
tableView.reloadData()
}
替换为:
searchedText = empList.filter{[=10=].emp_name?.contains(searchText)}
有了这个:
searchedText = empList.filter{ ([=11=].emp_name?.contains(searchText)) ?? false}.map(\.emp_name) ?? []
解决方案是将 Employee
的数组映射到 String
的数组,其中值是来自 Employee
模型的 emp_name
。
P.S:我正在使用 keyPaths >>> map(.emp_name) 因为它更短。
正如评论中已经提到的,强烈建议数据源和过滤后的数组是相同类型。
并将两者都声明为非可选的空数组并赋予它们更有意义的名称
var employees = [Employee]()
var filteredEmployees = [Employee]()
那么数据源方法就变得很简单了
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return searching ? filteredEmployees.count : employees.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CustomCell
let employee = searching : filteredEmployees[indexPath.row] : employees[indexPath.row]
cell.lblTitle.text = employee.emp_name
return cell
}
而在textDidChange
你必须考虑到用户可以删除所有字符
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchText.isEmpty {
searching = false
filteredEmployees.removeAll()
} else {
searching = true
filteredEmployees = employees.filter{[=12=].emp_name.range(of: searchText, options: .caseInsensitive) != nil}
}
tableView.reloadData()
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
searchBar.text = ""
}
我在从表视图中搜索数据时遇到问题。我想从 tableview 中搜索数据,但在搜索时卡住了。以下是我尝试过的代码。我遇到的问题是 无法将类型“[Employee]”的值分配给类型“[String]” 请帮忙。 TIA
var empList: [Employee]!
var searchedText = [String]()
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if searching {
return searchedText.count
} else {
return empList?.count ?? 0
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CustomCell
if searching {
cell.lblTitle.text = searchedText[indexPath.row]
}else {
let resObjects = empList?[indexPath.row]
cell.lblTitle.text = resObjects?.emp_name
}
return cell
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
searchedText = empList.filter{[=11=].emp_name?.contains(searchText)}
// The above line gives me error as, cannot assign value of type '[Employee]' to type '[String]'
searching = true
tableView.reloadData()
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
searching = false
searchBar.text = ""
tableView.reloadData()
}
替换为:
searchedText = empList.filter{[=10=].emp_name?.contains(searchText)}
有了这个:
searchedText = empList.filter{ ([=11=].emp_name?.contains(searchText)) ?? false}.map(\.emp_name) ?? []
解决方案是将 Employee
的数组映射到 String
的数组,其中值是来自 Employee
模型的 emp_name
。
P.S:我正在使用 keyPaths >>> map(.emp_name) 因为它更短。
正如评论中已经提到的,强烈建议数据源和过滤后的数组是相同类型。
并将两者都声明为非可选的空数组并赋予它们更有意义的名称
var employees = [Employee]()
var filteredEmployees = [Employee]()
那么数据源方法就变得很简单了
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return searching ? filteredEmployees.count : employees.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CustomCell
let employee = searching : filteredEmployees[indexPath.row] : employees[indexPath.row]
cell.lblTitle.text = employee.emp_name
return cell
}
而在textDidChange
你必须考虑到用户可以删除所有字符
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchText.isEmpty {
searching = false
filteredEmployees.removeAll()
} else {
searching = true
filteredEmployees = employees.filter{[=12=].emp_name.range(of: searchText, options: .caseInsensitive) != nil}
}
tableView.reloadData()
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
searchBar.text = ""
}