点击TableView Cell时将SearchController滚动至顶部的代码实现咨询
嘿,这个需求我刚好做过类似的,App Store那种点击搜索结果后平滑回到搜索顶部、同时保持搜索状态的体验确实很贴心,咱们一步步来实现:
实现步骤
1. 先确保持有UISearchController的全局引用
首先得在你的ViewController里保留一个UISearchController的实例,这样后续才能方便调用它的状态和方法:
class SearchResultsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { // 全局搜索控制器实例 let searchController = UISearchController(searchResultsController: nil) // 你的tableView实例 private let tableView = UITableView() // 其他初始化和生命周期代码... }
2. 在TableView的点击回调里处理滚动与状态保持
核心逻辑就在tableView(_:didSelectRowAt:)方法里,这里要做三件事:取消cell选中、滚动到顶部、保持搜索框激活状态,完全贴合App Store的表现:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { // 先取消cell的选中状态,提升交互体验 tableView.deselectRow(at: indexPath, animated: true) // 只在搜索激活状态下执行操作 guard searchController.isActive, let searchBar = searchController.searchBar else { return } // 安全判断:如果有数据就滚动到第一行,没有就直接滚到顶部偏移量 if tableView.numberOfRows(inSection: 0) > 0 { let topIndexPath = IndexPath(row: 0, section: 0) tableView.scrollToRow(at: topIndexPath, at: .top, animated: true) } else { tableView.setContentOffset(.zero, animated: true) } // 让搜索框重新获取焦点,保持搜索激活状态(和App Store一致) searchBar.becomeFirstResponder() }
3. 可选优化:确保搜索结果一致性
如果你的场景中,点击cell后可能需要刷新搜索结果(比如某些状态变化),可以在滚动后重新触发搜索更新:
// 可选:重新触发搜索结果更新,保证内容最新 searchController.searchResultsUpdater?.updateSearchResults(for: searchController)
4. 额外注意点
- 如果你用的是
UISearchResultsController作为独立的结果控制器,记得要在对应的结果控制器里处理上述逻辑,而不是主控制器。 - 动画时长可以根据需求调整,
scrollToRow的animated参数设为true就能实现平滑滚动,和系统默认的搜索滚动效果一致。
内容的提问来源于stack exchange,提问作者Nirav Hathi
相关产品推荐
相关产品推荐

