首页 > 解决方案 > 封装类中如何处理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”事件!

标签: iosswift

解决方案


终于找到了解决办法,观察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")
        }            
    }
}

推荐阅读