【问题标题】:Which to use? Delegate vs. keyPathObserver - UIViewController With Two UIScrollViews使用哪个?委托与 keyPathObserver - 具有两个 UIScrollViews 的 UIViewController
【发布时间】: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


【解决方案1】:

我想说最干净的方法就是将自己指定为滚动视图委托,并像你一样覆盖函数scrollViewDidScroll 和函数中的print(scrollView.contentOffset),然后用它做任何你需要的事情。如果您需要检查是否向下滚动,您可以将一个属性附加到您的类,以保存您的最后一个 contentOffset 并简单地将其与当前的比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多