MJRefresh
MJRefresh copied to clipboard
浮点数的误差,导致上拉刷新代码不执行
描述bug MJRefreshAutoNormalFooter 首次上拉刷新不会自动刷新,必须手动点击状态按钮才能刷新
必现/偶发? 在 iOS 13.6 上必现
怎么样重现这个bug 将配置了分页和上拉刷新的 UITableView 拉到底部(第一次加载),底部会显示点击或上拉刷新的状态按钮,不会自动刷新第二页数据。
运行环境
- iOS13.6
- Xcode12.3
额外的
经过查验,发现问题出在 MJRefreshAutoFooter 的代理方法 scrollViewPanStateDidChange
`上,方法中有个判断如下:
if (_scrollView.mj_offsetY >= _scrollView.mj_contentH + _scrollView.mj_insetB - _scrollView.mj_h) {
self.triggerByDrag = YES;
[self beginRefreshing];
}
这个判断 >= 符号前后的浮点值,会存在一个微小的误差,可能一个是 1367.666666666687, 一个是 1367.666666666698,这导致其中的代码不会执行了。
这可能是 iOS 13.6 系统对浮点数的处理上有问题导致的, 但是 MJRefresh 能够针对性的修复这个问题吗? 多谢!!!
- 方便传一个 Demo 吗?
- 模拟器会出现这个问题吗?
- 方便传一个 Demo 吗?
- 模拟器会出现这个问题吗?
抱歉,提供不了 demo。 这个不自动刷新的bug对于布局的要求可能会有些苛刻, 随便写个demo 不容易让 tableView 的contentHeight 以及offsetY 出现我上面所说的浮点误差。 是我公司的项目出现了这个问题,我通过给那个判断中的两个值加上 ceil 解决了这个问题。上面描述的“必现”是笔误,并不必现。 我看之前有个 issue 提到的就是这个问题 #1363 ,可能也是布局情况耦合刚好达到产生误差的条件, 不过解决去并没有提出解决方案。
我们的也出现了这个问题,关键是偶现
对了你是打开了. isPagingEnabled
了吗?
我们公司的项目也出现了这样的问题,上拉刷新回调方法只执行了一次,第二次就不执行了。以前用都没出现这样的问题,这是系统原因还是框架问题?有更好的解决办法吗
@dengsss 方便来个 Demo 么~
MJRefreshHeader.m 中 resetInset 方法中 if (self.scrollView.mj_insetT != insetT) { 这里判断出现浮点小数也会无限进判断,然后卡主。iPhone 14 Pro max iOS16.4 模拟器上加载collectionview有复现(真机iphone x没复现)。 insetT = 239.66666666666 ,self.scrollView.mj_insetT 的值会= 239.66666666669/239.66666666663跳动 类似这种的时候。
目前我是改成用 :insetT取4位小数,然后用 number isEqual: number 来判断。 @wolfcon