Ope*_*ead 5 iphone uitableview ios
当一个UITableView阻力已经结束时,我需要得到通知.
但我正在研究UITableView的类别,所以我不能用它scrollViewDidEndDragging:willDecelerate:来存档.
我尝试使用KVO在draggingKey Path 上观察:
[self addObserver:self forKeyPath:@"dragging" options:NSKeyValueObservingOptionNew context:nil];
Run Code Online (Sandbox Code Playgroud)
但是observeValueForKeyPath:ofObject:change:context:没有被调用,因为UITableView.dragging没有和setter这个属性不符合KVO.
有没有其他方法来存档这个期望使用scrollViewDidEndDragging:willDecelerate:?
任何帮助都很感激!谢谢!
编辑:下面我的解决方案是第一个想到的东西,结果是相当hacky,并且可能是不安全的,以防Apple决定改变UIScrollView类的内部.请参阅Mazyod建议的答案,该答案应该更安全,更直接.
这是依赖于实现的,可能会在未来的iOS更新中被Apple更改,但是当前UIScrollView类似乎依赖于手势识别器来管理用户交互,并且UITableView作为滚动视图类的子类也是如此.
如果你去UIKit框架的UIScrollView.h,你会注意到一个可疑的_panivar,它有一个id类型,但似乎实际上是一个UIPanGestureRecognizer.
所以我试过这个,它似乎有效.
[_tableView addObserver: self
forKeyPath: @"pan.state"
options: NSKeyValueObservingOptionNew
context: nil];
Run Code Online (Sandbox Code Playgroud)
拖动表格视图时,state手势识别器会多次更改,当您停止拖动时,state会收到其最后一次更改值UIGestureRecognizerStateEnded.
请注意,虽然这似乎可以解决问题,但其他一些问题可能会阻碍你.覆盖类别中的现有类方法通常不是一个好主意,因为此后原始实现变得不可访问.在文档NSKeyValueObserving的非正式协议规定,
NSObject提供NSKeyValueObserving协议的实现,该协议为所有对象提供自动观察功能.
因此,如果您observeValueForKeyPath:ofObject:change:context:在类别中覆盖,则默认实现将无法访问(我们无法确定UITableView或UIScrollView不使用KVO).这可能会导致一些意外错误.
Egor Chiglintsev的回答提醒我,我可以观察panGestureRecognizer已曝光的物业UIScrollView.它应该比安全得多pan.但后来......我发现我可以把自己添加为目标!
[_scrollView.panGestureRecognizer addTarget:self action:@selector(gestureRecognizerUpdate:)];
Run Code Online (Sandbox Code Playgroud)
这对我很有用!
| 归档时间: |
|
| 查看次数: |
2648 次 |
| 最近记录: |