Iphone 如何检测UITableView的拖动结束事件?
当Iphone 如何检测UITableView的拖动结束事件?,iphone,ios,uitableview,Iphone,Ios,Uitableview,当UITableView的拖动结束时,我需要得到通知 但是我正在处理UITableView的类别,所以我不能使用ScrollViewDiEndDraging:WillDecreate:来存档此内容 我尝试使用KVO观察拖动键路径: [self addObserver:self forKeyPath:@"dragging" options:NSKeyValueObservingOptionNew context:nil]; 但是未调用对象:更改:上下文:的observeValueForKeyPa
UITableView
的拖动结束时,我需要得到通知
但是我正在处理UITableView的类别,所以我不能使用ScrollViewDiEndDraging:WillDecreate:
来存档此内容
我尝试使用KVO观察拖动键路径:
[self addObserver:self forKeyPath:@"dragging" options:NSKeyValueObservingOptionNew context:nil];
但是未调用对象:更改:上下文:
的observeValueForKeyPath:ofObject:change:context:
,因为UITableView.Draging没有和setter,并且此属性与KVO不兼容
除了使用ScrollViewDiEndDraging:WillDecreate:
,还有其他方法来存档此文件吗
任何帮助都是感激的!谢谢 编辑:我首先想到的是下面的解决方案,结果证明它相当粗糙,如果苹果决定更改
UIScrollView
类的内部结构,使用起来可能不安全。参见Mazyod建议的更安全、更直接的方法
这取决于实现,苹果可能会在未来的iOS更新中对其进行更改,但目前,
UIScrollView
类似乎依赖手势识别器来管理用户交互,而作为scroll view类的子类,UITableView
也同样如此
如果您转到UIKit框架的UIScrollView.h,您会注意到一个可疑的\u pan
ivar,它有一个id
类型,但实际上似乎是一个UIPangestureRecognitor
所以我试过这个,它似乎有效
[_tableView addObserver: self
forKeyPath: @"pan.state"
options: NSKeyValueObservingOptionNew
context: nil];
拖动表格视图时,手势识别器的状态会发生几次更改,当停止拖动时,state
会接收其对UIgestureRecognitizerStateEnded
值的最后更改
请注意,虽然这似乎可以解决问题,但其他一些问题可能会阻碍您。覆盖一个类别中现有的类方法通常不是一个好主意,因为在那之后原始实现就变得不可访问了。关于非正式议定书的文件指出:
NSObject提供了NSKeyValueObserving协议的实现,该协议为所有对象提供了自动观察功能
因此,如果在类别中重写对象:更改:上下文:的observeValueForKeyPath:ofObject:change:context:,则默认实现将无法访问(并且我们无法确保
UITableView
或UIScrollView
不使用KVO进行某些操作)。这可能会导致一些意外错误。Egor Chiglintsev的回答提醒我可以观察到panGestureRecognizer
属性已在UIScrollView
中公开。它应该比pan
安全得多。但是。。我发现我可以将自己添加为目标
[_scrollView.panGestureRecognizer addTarget:self action:@selector(gestureRecognizerUpdate:)];
这对我来说太棒了 如果我在某个类“Foo”中实现了observeValueForKeyPath:ofObject:change:context:,并且UITableView类别保留了一个Foo实例,该怎么办?谢谢您的帮助!你的回答对我很有帮助!在一个单独的Foo类中实现observeValueForKeyPath:ofObject:change:context:确实有助于解决“覆盖类别中的现有方法”的问题。我想这是正确的方法。我不知道为什么我脑海中首先想到的通常是一些运行时或KVO相关的黑客。(谢谢)