ios - 封装类中如何处理tableView的scrollView事件?
问题描述
我试过了:
tableView.delegate=someClass
然后在 someClass 中,我可以使用 scrollViewWillBeginDragging、scrollViewDidScroll、scrollViewDidEndDragging 方法来处理滚动事件。
但!someClass 还带了我tableView 的[viewForHeaderInSection]、[didSelectRowAt] 方法,而这些方法在someClass 中无法处理!
我还在 someClass 中尝试了 addObserver:
tableView.addObserver(self, forKeyPath: "contentOffset", options: .new, context: nil)
观察tableView的滚动位置,但永远无法观察到“scrollViewDidEndDragging”和“scrollViewWillBeginDragging”事件!
解决方案
终于找到了解决办法,观察didEndDragging事件,在tableView的panGestureRecognizer中再添加一个观察者
tableView.panGestureRecognizer.addObserver(self, forKeyPath: "state", options: [.new,.old], context: nil)
tableView.addObserver(self, forKeyPath: "contentOffset", options: [.new,.old], context: nil)
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "contentOffset" {
//handle scrollview's content offset changing
}
if keyPath == "state"{
let pan=tableView.panGestureRecognizer
if pan.state == .began{
print("pan state is began!")
}
else if pan.state == .recognized{
print("is scrollViewDidEndDragging")
}
}
}
推荐阅读
- python - 如何优雅地在循环中添加列表元素?
- spring-batch - 在 FlatFileItemReader 自定义 bufferedReader 实例中检测作业何时停止
- python - 读取文件的前 10 行;如果更短只阅读那些行
- python - 如何使用 Graphql 的长字符串参数向我的后端服务器发布请求
- android - Android 资源链接失败。AAPT:错误:找不到资源 android:attr/dialogCornerRadius
- typescript - Vue 没有从我的插件中看到组件
- reactjs - 在反应中集成幸运橙
- python - 有没有办法在 df.loc 关键字中指定变量名?
- go - 如何知道 2 个 go 地图是否引用相同的数据
- java - 独立/嵌入式 Web 服务器,用于制作可移植的 Web 应用程序