Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何检测UITableView的拖动结束事件?_Iphone_Ios_Uitableview - Fatal编程技术网

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相关的黑客。(谢谢)