2013-02-11 11 views
5

UITableViewのドラッグが終了したときに通知を受ける必要があります。UITableViewのドラッグ終了イベントを検出する方法は?

私はUITableViewのカテゴリに取り組んでいますので、これをアーカイブするのにscrollViewDidEndDragging:willDecelerate:を使用することはできません。

私はdraggingキーのパスに観察するために使用KVOを試してみました:UITableView.draggingが持っているとセッターと、このプロパティはKVOに準拠していないいないので

[self addObserver:self forKeyPath:@"dragging" options:NSKeyValueObservingOptionNew context:nil]; 

しかしobserveValueForKeyPath:ofObject:change:context:は、呼び出されませんでした。

scrollViewDidEndDragging:willDecelerate:を使用してこの期待値をアーカイブする方法はありますか?

ご協力いただきありがとうございます。ありがとう!

答えて

8

編集:私のソリューションは、以下を念頭に来て最初のものだったとかなりハックするとAppleはUIScrollViewクラスの内部を変更することを決定する場合に使用する、安全でないかもしれ判明しました。 Mazyodによって提案されたanswerを参照してください。より安全で簡単です。


これは、実装依存であり、将来のiOSのアップデートでアップルによって変更することができるが、現在UIScrollViewクラスがユーザーの操作を管理するためのジェスチャー認識器に頼っているようだとUITableViewは、スクロールビュークラスのサブクラスであること同じことを行います。

UIKitフレームワークのUIScrollView.hにアクセスすると、idタイプの疑わしい_pan ivarに気付くことができますが、実際にはUIPanGestureRecognizerと思われます。

私はこれを試しましたが、うまくいくようです。

[_tableView addObserver: self 
       forKeyPath: @"pan.state" 
       options: NSKeyValueObservingOptionNew 
       context: nil]; 

テーブルビューをドラッグすると、ジェスチャー認識のstateを複数回変更し、ドラッグを停止したときに、stateUIGestureRecognizerStateEndedの値への最後の変更を受けます。

これはトリックを行うようですが、いくつかの他の問題があなたの方法で立つかもしれないことに注意してください。カテゴリ内の既存のクラスメソッドをオーバーライドすることは、元の実装にはアクセスできなくなるため、一般的にはお勧めできません。 NSKeyValueObserving非公式プロトコルに関するドキュメント

NSObjectは、すべてのオブジェクトに対して自動監視機能を提供するNSKeyValueObservingプロトコルの実装を提供します。

あなたはカテゴリ内observeValueForKeyPath:ofObject:change:context:を上書きするのであれば、デフォルトの実装ではアクセスできなくなります(と私たちはUITableViewまたはUIScrollViewが何かのためのユーザーKVOしていないことを確認することはできません)。予期しないエラーが発生することがあります。

+0

いくつかのクラス 'Foo'では 'observeValueForKeyPath:ofObject:change:context:'を実装し、UITableViewカテゴリはFooのインスタンスを保持しますか? – OpenThread

+0

助けてくれてありがとう!あなたの答えは私にとって役に立つvvvvveryです! – OpenThread

+1

別のFooクラスの 'observeValueForKeyPath:ofObject:change:context:'を実装することは、実際には 'categoryの既存のメソッドをオーバーライドする 'ことに役立つはずです。 –

8

私はすでにUIScrollViewに公開されているpanGestureRecognizerプロパティを観察することができますEgor Chiglintsevの答えを思い出しました。 panよりはるかに安全です。しかし、その後..私は自分自身を目標として追加することができることを知った!

[_scrollView.panGestureRecognizer addTarget:self action:@selector(gestureRecognizerUpdate:)]; 

これは私にとって素晴らしいです!

+1

私はそれが本当にやるべき正しい方法だと思います。なぜ私の心の中に来る最初のものが通常ランタイムかKVO関連のハッキングなのか分かりません。ありがとう) –

関連する問題