swift - Swift 表视图和搜索控制器 didSelectRowAt 索引超出范围
问题描述
在 Swift 中,我使用 SearchController 和 TableView 以及下面的搜索 API。
https://developers.giphy.com/docs/api/endpoint#search
api.giphy.com/v1/gifs/search
当我输入 SearchController 字段时,TableView 通常会重新加载(出现自动完成的搜索关键字)。但是当我选择 TableView 的行时,在某些情况下发生了“索引超出范围”错误(在我的 ViewModel 中),我无法弄清楚是什么原因。
func searchKeyword(indexPath: Int) -> String?
ViewModel 中发生错误行
这是我的代码。
视图控制器
extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
guard let count = self.viewModel?.resultsCount() else { return 0 }
return count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = searchTableView.dequeueReusableCell(withIdentifier: "CellID", for: indexPath) as? searchTableViewCell else { return UITableViewCell() }
guard let result = self.viewModel?.selectedKeyword(at: indexPath.row) else { return UITableViewCell() }
cell.configureCell(result: result.name)
return cell
}
}
extension ViewController: UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
guard let text = searchController.searchBar.text?.lowercased() else { return }
self.viewModel?.fetchKeywords(searchKeyword: text)
self.searchTableView.reloadData()
}
}
extension ViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
guard let nextViewController = self.storyboard?.instantiateViewController(withIdentifier: "NextViewControllerID") as? NextViewController else { return }
guard let result = self.viewModel?.searchKeyword(indexPath: indexPath.row) else { return }
nextViewController.showNextViewController(with: NextViewModel(keyword: result))
self.navigationController?.pushViewController(nextViewController.show, animated: true)
}
}
extension ViewController: UISearchResultsUpdating {
func updateResults(for searchController: UISearchController) {
guard let text = searchController.searchBar.text?.lowercased() else { return }
self.viewModel?.fetchKeywords(searchKeyword: text)
self.searchResults.reloadData()
}
}
视图模型
func fetchKeywords(searchKeyword: String) {
self.useCase.fetchKeywords(searchKeyword: searchKeyword, paginationCount: 5) { error, result in
if let error = error {
self.error = error
}
if let result = result {
self.results = result.searchKeywords
}
}
}
func resultsCount() -> Int {
guard let count = self.results?.count else { return 0 }
return count
}
// Fatal error: Index out of range
func searchKeyword(indexPath: Int) -> String? {
guard let results = results else { return nil }
return results[indexPath].name
}
func selectedKeyword(at indexPath: Int) -> Keyword? {
guard let results = self.results else { return nil }
return results[indexPath]
}
解决方案
推荐阅读
- delphi - JEDI JVScheduleEvents 用法
- python - 错误:找不到满足要求的版本 tensorflow==2.1.0 和 No matching distribution found for tensorflow==2.1.0
- powershell - 将存档 zip 文件解压缩到与存档 zip 文件同名的文件夹中
- realm - keycloak API 出现 403 错误
- angular - 当 JSON 字段名称中有空格时,将来自 Web 服务的 JSON 响应映射到 Angular 类
- javascript - 在反应本机导航屏幕之间切换时,PanGesture 动画不起作用
- reactjs - 将 CRA 捆绑到单个 js 文件中
- python - Pyspark:为什么 ST_intersects 函数返回重复的行?
- c# - 在 Swashbuckle 5 中显示模型内部 IFormFile 的上传按钮
- ios - ios swift中注销后如何调用appdelegate.swift?