gpt4 book ai didi

iphone - 如何检测 UITableView 的拖动结束事件?

转载 作者:可可西里 更新时间:2023-11-01 04:09:18 26 4
gpt4 key购买 nike

我需要在 UITableView 的拖动结束时得到通知。

但我正在处理 UITableView 的类别,所以我不能使用 scrollViewDidEndDragging:willDecelerate: 来存档它。

我尝试使用 KVO 观察 拖动 关键路径:

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

但是 observeValueForKeyPath:ofObject:change:context: 没有被调用,因为 UITableView.dragging 没有和 setter 并且这个属性不符合 KVO。

是否有任何其他方法可以使用 scrollViewDidEndDragging:willDecelerate: 来存档此预期?

如有帮助,不胜感激!谢谢!

最佳答案

编辑:我首先想到的是我下面的解决方案,结果发现它相当老套,如果 Apple 决定更改 UIScrollView 的内部结构,使用起来可能不安全 类。查看answer Mazyod 建议,应该更安全、更直接。


这取决于实现,Apple 可能会在未来的 iOS 更新中更改,但目前 UIScrollView 类似乎依赖于手势识别器来管理用户交互,而 UITableView 正在 ScrollView 类的子类做同样的事情。

如果你转到 UIKit 框架的 UIScrollView.h,你会注意到一个可疑的 _pan ivar,它有一个 id 类型,但似乎实际上是一个 UIPanGestureRecognizer.

所以我试过了,它似乎有效。

 [_tableView addObserver: self 
forKeyPath: @"pan.state"
options: NSKeyValueObservingOptionNew
context: nil];

当拖动表格 View 时,手势识别器的 state 会发生多次变化,当您停止拖动时,state 会收到其最后一次更改为 的值UIGestureRecognizerStateEnded.

请注意,虽然这似乎可以解决问题,但其他一些问题可能会妨碍您。覆盖类别中现有的类方法通常不是一个好主意,因为在那之后原始实现变得不可访问。关于 NSKeyValueObserving 的文档非正式协议(protocol)指出

NSObject provides an implementation of the NSKeyValueObserving protocol that provides an automatic observing capability for all objects.

因此,如果您在类别中重写 observeValueForKeyPath:ofObject:change:context:,默认实现将无法访问(并且我们无法确定 UITableViewUIScrollView 不要为某些事情使用 KVO)。这可能会导致一些意外错误。

关于iphone - 如何检测 UITableView 的拖动结束事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14817047/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com