我需要在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:
的方法?
任何帮助都很感激!谢谢!
答案 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)
panGestureRecognizer
中已经暴露的UIScrollView
财产。它应该比pan
安全得多。但后来......我发现我可以把自己添加为目标!
[_scrollView.panGestureRecognizer addTarget:self action:@selector(gestureRecognizerUpdate:)];
这对我很有用!