MJRefresh icon indicating copy to clipboard operation
MJRefresh copied to clipboard

浮点数的误差,导致上拉刷新代码不执行

Open CoooooooderJ opened this issue 4 years ago • 7 comments

描述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 能够针对性的修复这个问题吗? 多谢!!!

CoooooooderJ avatar Dec 29 '20 06:12 CoooooooderJ

  • 方便传一个 Demo 吗?
  • 模拟器会出现这个问题吗?

wolfcon avatar Dec 29 '20 07:12 wolfcon

  • 方便传一个 Demo 吗?
  • 模拟器会出现这个问题吗?

抱歉,提供不了 demo。 这个不自动刷新的bug对于布局的要求可能会有些苛刻, 随便写个demo 不容易让 tableView 的contentHeight 以及offsetY 出现我上面所说的浮点误差。 是我公司的项目出现了这个问题,我通过给那个判断中的两个值加上 ceil 解决了这个问题。上面描述的“必现”是笔误,并不必现。 我看之前有个 issue 提到的就是这个问题 #1363 ,可能也是布局情况耦合刚好达到产生误差的条件, 不过解决去并没有提出解决方案。

CoooooooderJ avatar Dec 29 '20 12:12 CoooooooderJ

我们的也出现了这个问题,关键是偶现

sky-city-a avatar Jan 27 '21 06:01 sky-city-a

对了你是打开了. isPagingEnabled 了吗?

wolfcon avatar Mar 04 '21 09:03 wolfcon

我们公司的项目也出现了这样的问题,上拉刷新回调方法只执行了一次,第二次就不执行了。以前用都没出现这样的问题,这是系统原因还是框架问题?有更好的解决办法吗

dengsss avatar May 25 '21 00:05 dengsss

@dengsss 方便来个 Demo 么~

wolfcon avatar May 25 '21 01:05 wolfcon

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

ExchangeMe avatar Aug 30 '23 02:08 ExchangeMe