5

UITableViewのドラッグが終了したときに通知を受け取る必要があります。

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

KVOを使用してdraggingキーパスを観察しようとしました:

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

observeValueForKeyPath:ofObject:change:context:UITableView.dragging にはセッターがなく、このプロパティは KVO に準拠していないため、呼び出されませんでした。

を使用するためにこれをアーカイブする他の方法はありますscrollViewDidEndDragging:willDecelerate:か?

どんな助けでも感謝しています!ありがとう!

4

2 に答える 2

9

編集:以下の私の解決策は最初に頭に浮かんだことでしたが、かなりハックであることが判明し、Apple がUIScrollViewクラスの内部を変更することを決定した場合に使用するのは安全ではない可能性があります。Mazyod によって提案された、より安全で簡単な回答を参照してください。


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

UIKit フレームワークの UIScrollView.h に移動すると_pan、型を持っているidが実際にはUIPanGestureRecognizer.

だから私はこれを試してみましたが、うまくいくようです。

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

テーブル ビューをドラッグするstateと、ジェスチャ レコグナイザーが数回変化し、ドラッグを停止するとstate、最後の変化を の値に受け取りますUIGestureRecognizerStateEnded

これでうまくいくように見えますが、他の問題が邪魔になる可能性があることに注意してください。その後、元の実装にアクセスできなくなるため、通常、カテゴリ内の既存のクラス メソッドをオーバーライドすることはお勧めできません。NSKeyValueObserving非公式議定書に関する文書には、次のように記載されています。

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

そのため、カテゴリでオーバーライドobserveValueForKeyPath:ofObject:change:context:すると、デフォルトの実装にアクセスできなくなります (そして、何かに KVO を使用していないかどうかはわかりません) UITableViewUIScrollViewこれにより、予期しないエラーが発生する可能性があります。

于 2013-02-11T17:44:18.457 に答える