【发布时间】:2017-07-06 22:33:24
【问题描述】:
在实现这一点之前,我想知道在 UIScrollView 移动时实现与 contentOffest 相关的最佳处理方式。
注意:在读到有多个对象调用委托方法可能会出现问题时提出这个问题
1) 为每个视图的 contentOffset keyPaths 添加观察者
2) 使我的类成为 UIScrollViewDelegate 并使用 scrollViewDidScroll
class MyAwesomeVC: UIViewController, UIScrollViewDelegate {
@IBOutlet weak var scrollViewA: UIScrollView!
@IBOutlet weak var scrollViewB: UIScrollView!
private var observerContext = 0
...
override func viewDidLoad() {
super.viewDidLoad()
scrollViewA.delegate = self
scrollViewB.delegate = self
scrollViewA.addObserver(self, forKeyPath: "contentOffset", options: .new, context: &observerContext)
scrollViewB.addObserver(self, forKeyPath: "contentOffset", options: .new, context: &observerContext)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
// check which scrollview if possible then do all the things
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
// check which scrollview if possible then do all the things
}
...
deinit {
scrollViewA.removeObserver(self, forKeyPath: "contentOffset", context: &observerContext)
scrollViewB.removeObserver(self, forKeyPath: "contentOffset", context: &observerContext)
scrollViewA = nil
scrollViewB = nil
}
}
【问题讨论】:
-
这是一个有点基于意见的问题(因此它可能会被关闭),但选项 2 更简单,需要的代码也更少。
-
我正在查看此内容而没有其他代码妨碍,并且有一个辅助问题 - 像 scrollViewDidScroll 这样的委托方法是否已经从 keyPathObservers 触发?我之所以问,是因为在查找它时,有人声称使用委托方法和多个调用它的对象会变得混乱。
-
delegate 和 KVO 没有任何关系。但是在这里实现两者都没有意义。由于您的需要存在委托方法,因此使用 KVO 毫无意义。在委托方法中,您可以简单地将
scrollView参数与您的两个插座属性进行比较,以了解哪个滚动视图已被滚动。很简单。
标签: ios swift uiscrollview delegates