2013-02-11 45 views
5

UITableView的拖累结束时,我需要得到通知。如何检测UITableView的拖动结束事件?

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

我试图使用国际志愿者组织,观察dragging关键路径:

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

observeValueForKeyPath:ofObject:change:context:没有被调用,因为UITableView.dragging没有和setter和该属性不符合志愿。

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

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

回答

8

编辑:下面我的解决办法进来,想到的第一件事,竟然是相当哈克和可能不安全的情况下,使用苹果决定改变UIScrollView类的内部。请参阅Mazyod建议的answer,这应该更安全,更直接。


这是依赖于实现,并且可以通过苹果在未来的iOS更新而改变,但目前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:,默认的实现将无法访问(我们不能确保UITableViewUIScrollView没有用户志愿的东西)。这可能会导致一些意外的错误。

+0

如果我在一些类'Foo'中实现'observeValueForKeyPath:ofObject:change:context:',并且UITableView类别保留了Foo的一个实例? – OpenThread 2013-02-12 15:36:47

+0

感谢您的帮助!你的回答对我来说是有帮助的! – OpenThread 2013-02-12 15:37:44

+1

在单独的Foo类中实现'observeValueForKeyPath:ofObject:change:context:'应该确实有助于'覆盖类别中的现有方法'问题。 – 2013-02-12 15:46:19

8

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

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

这对我很好用!

+1

我想这是应该真正完成的正确方法。不知道为什么我脑海中的第一件事通常是一些运行时或KVO相关的黑客。谢谢) – 2014-06-30 09:17:25