iOS应用搜索结果Cell点击后播放错误视频问题求助
解决搜索后点击Cell播放错误视频的问题
我看了你的代码,核心问题出在**isSearching的状态判断逻辑搞反了**,而且didSelectRowAt里的分支完全没必要——因为你已经维护了currentArray作为TableView的数据源,不管是搜索还是非搜索状态,直接用它就可以了!
问题分析
isSearching赋值错误:在searchBar(_:textDidChange:)方法里,当搜索文本为空时你设置了isSearching = true,这完全和实际状态相反。应该是搜索文本不为空时才是搜索状态,为空时恢复成非搜索状态。didSelectRowAt逻辑冗余且错误:你分了isSearching的分支去取flix或者currentArray,但实际上currentArray在非搜索状态下已经等于flix了,直接用currentArray就能拿到当前点击Cell对应的数据源,不需要额外判断。这也是为什么你点击搜索结果时会播放错误视频——因为你的isSearching状态一直不对,导致代码走到了取flix的分支。
修复步骤
1. 修正searchBar(_:textDidChange:)方法的isSearching赋值
把原来的逻辑反过来:
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { if searchText.isEmpty { isSearching = false currentArray = flix } else { isSearching = true currentArray = flix.filter { $0.title.contains(searchText) } } grrr.reloadData() }
2. 简化didSelectRowAt方法
直接使用currentArray获取点击的视频地址,去掉多余的分支判断:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let selectedCourse = currentArray[indexPath.row] guard let videoUrl = URL(string: selectedCourse.location) else { print("Invalid video URL") return } let player = AVPlayer(url: videoUrl) let controller = AVPlayerViewController() controller.player = player present(controller, animated: true) { player.play() } }
额外优化建议(可选)
- 给图片加载加个缓存,避免重复请求:可以用第三方库或者自己实现简单缓存逻辑,防止滚动TableView时重复发起图片请求。
- 在
fetchJSON里同步更新currentArray:因为fetchJSON是异步请求,初始加载完成后需要同步更新显示用的数据源,修改后的片段如下:
do { let decoder = JSONDecoder() self.flix = try decoder.decode([Courses].self, from: data) self.currentArray = self.flix // 新增这行,确保数据源同步 self.grrr.reloadData() print(self.flix) } catch let jsonErr { print("Failed to decode JSON", jsonErr) }
为什么这样改能解决问题?
- 修正后的
isSearching能正确反映当前是否处于搜索状态(不过现在didSelectRowAt已经不需要依赖它了)。 - 直接使用
currentArray作为数据源,确保点击的Cell和播放的视频是一一对应的——不管是搜索还是非搜索状态,currentArray都是TableView正在显示的数组,不会出现错位的情况。
内容的提问来源于stack exchange,提问作者Connor Woodford
相关产品推荐
相关产品推荐

