在 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 = ""
}