搜索时UITableView未刷新,venuesShown数组更新正常但界面无变化
问题根因定位
最核心的错误在cellForRowAt代理方法的搜索状态分支:完成自定义cell的赋值逻辑后没有返回构造好的cell,最后默认返回了空白的UITableViewCell(),导致界面看不到搜索结果。同时代码存在拼写错误、可选值强制解包风险等潜在问题。
修复步骤
1. 修复cellForRowAt的返回逻辑与拼写错误
补全搜索分支的return语句,同时修正默认返回的类名拼写错误:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if venueArray.count > 0 && !searchIsActive { let cell = tableView.dequeueReusableCell(withIdentifier: "ChooseVenueTableViewCell", for: indexPath) as! ChooseVenueTableViewCell loadImageWith(imgView: cell.barImgView, url: venueArray[indexPath.row].venueImgNSString as String?) cell.venueLabel.text = venueArray[indexPath.row].venueName return cell } else if venueArray.count > 0 && searchIsActive { let cell = tableView.dequeueReusableCell(withIdentifier: "ChooseVenueTableViewCell", for: indexPath) as! ChooseVenueTableViewCell loadImageWith(imgView: cell.barImgView, url: venuesShown[indexPath.row].venueImgNSString as String?) cell.venueLabel.text = venuesShown[indexPath.row].venueName // 补上缺少的return语句 return cell } // 修正拼写错误:UITableviewcell -> UITableViewCell return UITableViewCell() }
2. 优化搜索边界逻辑
搜索清空时同步重置搜索结果数组,避免残留旧数据:
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { if searchText.isEmpty { searchIsActive = false // 清空搜索缓存 venuesShown.removeAll() } else { searchIsActive = true // 去掉venueName的强制解包,避免空值闪退 self.venuesShown = venueArray.filter { $0.venueName?.range(of: searchText, options: [.anchored, .caseInsensitive, .diacriticInsensitive]) != nil } } self.chooseVenueTableView.reloadData() }
3. 可选校验项
- 确认
getBars异步回调中已经正确给venueArray赋值,且数组赋值完成后再调用reloadData,保证数据源时序正确 - 替换代码中所有
!强制解包逻辑,改为可选绑定或默认值,避免空值闪退
内容的提问来源于stack exchange,提问作者WhySoSerious33
相关产品推荐
相关产品推荐

