5

UITableView当我的拖拽结束时,我需要得到通知。

但我正在处理 UITableView 的类别,所以我不能用它scrollViewDidEndDragging:willDecelerate:来存档。

我尝试使用 KVO 在draggingKey Path 上进行观察:

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

但是observeValueForKeyPath:ofObject:change:context:没有被调用,因为 UITableView.dragging 没有和 setter 并且这个属性不符合 KVO。

有没有其他方法可以存档这个期望使用scrollViewDidEndDragging:willDecelerate:

任何帮助将不胜感激!谢谢!

4

2 回答 2

9

编辑:我首先想到的解决方案是下面的解决方案,结果证明它相当老套,如果 Apple 决定更改UIScrollView课程的内部结构,使用起来可能不安全。请参阅 Mazyod 建议的答案,这应该更安全、更直接。


这是依赖于实现的,Apple 可能会在未来的 iOS 更新中对其进行更改,但目前UIScrollView的类似乎依赖于手势识别器来管理用户交互,并且UITableView作为滚动视图类的子类也是如此。

如果你转到 UIKit 框架的 UIScrollView.h,你会注意到一个可疑的_panivar,它有一个id类型,但实际上似乎是一个UIPanGestureRecognizer.

所以我试过这个,它似乎工作。

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

拖动表格视图时,state手势识别器会发生多次更改,当您停止拖动时,state会收到其对 值的最后一次更改UIGestureRecognizerStateEnded

请注意,尽管这似乎可以解决问题,但其他一些问题可能会妨碍您。覆盖类别中现有的类方法通常不是一个好主意,因为在此之后原始实现变得不可访问。关于NSKeyValueObserving非正式协议的文件指出

NSObject 提供了 NSKeyValueObserving 协议的实现,该协议为所有对象提供自动观察能力。

因此,如果您observeValueForKeyPath:ofObject:change:context:在某个类别中覆盖,默认实现将无法访问(我们无法确定UITableViewUIScrollView不使用 KVO)。这可能会导致一些意外错误。

于 2013-02-11T17:44:18.457 回答
8

Egor Chiglitsev 的回答提醒我,我可以观察到panGestureRecognizer已经暴露的属性UIScrollView。它应该比pan. 但是后来..我发现我可以将自己添加为目标!

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

这对我很有用!

于 2014-06-23T04:28:27.190 回答