Swift 5如何实现UITableView处于顶部下拉时调用指定方法
实现UITableView下拉刷新的方案(Swift 5)
你要的交互效果就是iOS中常见的下拉刷新逻辑,优先推荐用系统原生组件实现,不需要额外监听滚动事件,适配性更好。
方案1:使用系统原生UIRefreshControl(推荐)
这是iOS自带的下拉刷新组件,完全匹配你需要的「滚动到顶部后下拉触发指定方法」的交互逻辑,代码实现简单:
import UIKit class YourViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { @IBOutlet weak var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() // 基础配置 tableView.dataSource = self tableView.delegate = self // 初始化刷新控件 let refreshControl = UIRefreshControl() // 绑定下拉触发的方法 refreshControl.addTarget(self, action: #selector(refreshList), for: .valueChanged) // 给tableView绑定刷新控件(iOS 10+直接支持该属性,更低版本用addSubview添加即可) tableView.refreshControl = refreshControl } // 下拉触发的自定义刷新方法 @objc private func refreshList() { // 此处写你需要执行的刷新逻辑:比如网络请求、更新本地数据源 print("触发刷新操作") // 刷新完成后调用该方法收起刷新控件,替换为你自己的请求完成回调逻辑即可 DispatchQueue.main.asyncAfter(deadline: .now() + 1) { [weak self] in self?.tableView.reloadData() self?.tableView.refreshControl?.endRefreshing() } } // MARK: - UITableViewDataSource 协议实现 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // 替换为你自己的数据源长度 return 20 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "CellID", for: indexPath) // 配置cell内容 return cell } }
方案2:自定义监听滚动事件(不需要系统刷新控件时使用)
如果要完全自定义交互、不需要系统默认的刷新动画,可以通过UIScrollView的代理方法监听滚动偏移量,手动判断触发时机:
// 标记是否已经触发刷新,避免重复调用 private var hasTriggeredRefresh = false // 触发刷新的下拉距离,可根据需求调整 private let triggerOffset: CGFloat = 80 // 实现UIScrollViewDelegate代理方法 func scrollViewDidScroll(_ scrollView: UIScrollView) { // scrollView.contentOffset.y < 0 代表已经滚动到顶部,继续向下拉 if scrollView.contentOffset.y < -triggerOffset && !hasTriggeredRefresh && !scrollView.isDragging { // 用户松手时触发,也可以去掉该判断,下拉到指定距离立刻触发 hasTriggeredRefresh = true // 调用你的刷新方法 refreshList() } } private func refreshList() { // 你的刷新逻辑... // 刷新完成后重置标记位 hasTriggeredRefresh = false }
注意事项
- 优先选择系统
UIRefreshControl,交互符合iOS用户的使用习惯,不需要手动处理边界判断,系统版本适配更稳定 - 如果需要自定义刷新动画,可以修改
UIRefreshControl的tintColor、attributedTitle属性,或者替换为第三方自定义刷新控件
内容的提问来源于stack exchange,提问作者bircastri
相关产品推荐
相关产品推荐

