如何检测UITableView的拖动结束事件?

时间:2013-02-11 17:03:59

标签: iphone ios uitableview

我需要在UITableView拖动结束时收到通知。

但是我正在研究UITableView的类别,所以我不能使用scrollViewDidEndDragging:willDecelerate:来存档它。

我尝试使用KVO观察dragging关键路径:

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

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

是否还有其他方法可以归档这种使用scrollViewDidEndDragging:willDecelerate:的方法?

任何帮助都很感激!谢谢!

2 个答案:

答案 0 :(得分:8)

编辑:下面我的解决方案是第一个想到的东西,结果是相当hacky,如果Apple决定更改{{1}的内部结构,可能会使用它不安全}类。请参阅Mazyod建议的answer,它应该更安全,更直接。


这是依赖于实现的,可能会在未来的iOS更新中被Apple更改,但目前UIScrollView类似乎依赖于手势识别器来管理用户交互,UIScrollView是滚动视图的子类班级做同样的事。

如果你去了UIKit框架的UIScrollView.h,你会注意到一个UITableView ivar,它有_pan类型,但实际上似乎是id

所以我试过这个,它似乎有效。

UIPanGestureRecognizer

拖动表格视图时,手势识别器的 [_tableView addObserver: self forKeyPath: @"pan.state" options: NSKeyValueObservingOptionNew context: nil]; 会多次更改,当您停止拖动时,state会将最后一次更改收到state的值。

请注意,虽然这似乎可以解决问题,但其他一些问题可能会阻碍你。覆盖类别中的现有类方法通常不是一个好主意,因为此后原始实现变得不可访问。 NSKeyValueObserving非正式协议的文件说明了

  

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

因此,如果您覆盖某个类别中的UIGestureRecognizerStateEnded,则默认实施将无法访问(我们无法确定observeValueForKeyPath:ofObject:change:context:UITableView是否不为某些用户提供KVO)。这可能会导致一些意外错误。

答案 1 :(得分:8)

Egor Chiglintsev的回答提醒我,我可以观察panGestureRecognizer中已经暴露的UIScrollView财产。它应该比pan安全得多。但后来......我发现我可以把自己添加为目标!

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

这对我很有用!