2017-07-06 7 views
0

これを実行するまでには、UIScrollViewの移動に伴ってcontentOffestに関して何かを実行する最適な方法を知りたいと思っていました。どちらを使用しますか?デリゲート対keyPathObserver - 2つのUIScrollViewsを持つUIViewController

注:ビューcontentOffsetキーパス

2のそれぞれにオブザーバーを追加する)デリゲートメソッドを呼び出して複数のオブジェクトを持つことが

1問題となる可能性があることを読んだからこれを頼む)私のクラスaを作ります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 
    } 


} 
+0

これは多少の意見に基づく質問です(閉じられる可能性があります)。しかし、オプション2ははるかに簡単で、はるかに少ないコードしか必要としません。 – rmaddy

+0

私は途中で残りのコードを必要とせずにこれを探していました。また、scrollPathDidScrollのようなデリゲートメソッドが既にkeyPathObserversからトリガーされていますか? 私はそれを見ているときに、それを呼び出す複数のオブジェクトを持つデリゲートメソッドを使用すると乱雑になる可能性があるという主張があったからです。 – solenoid

+0

デリゲートとKVOはお互いに関係ありません。しかし、ここで両方を実装することに意味はありません。あなたのニーズに応じてデリゲートメソッドが存在するので、KVOを使用するのは無意味です。デリゲートメソッドの内部では、 'scrollView'パラメータを2つのコンセントプロパティと単純に比較して、どのスクロールビューがスクロールされたかを知ることができます。非常に簡単です。 – rmaddy

答えて

0

私は、これはちょうど、スクロールビューのデリゲートとして自分を割り当て、あなたが持っているように機能scrollViewDidScrollをオーバーライドすることで行うためのクリーンな方法を言うだろうし、関数内にprint(scrollView.contentOffset)を置き、必要な処理を行います。スクロールしているかどうかを確認する必要がある場合は、最後のcontentOffsetを保存して現在のクラスと比較するプロパティをクラスに追加できます。

関連する問題