美文网首页
2020-03-13 MJRefresh使用过程中出现的问题

2020-03-13 MJRefresh使用过程中出现的问题

作者: 各种垫底 | 来源:发表于2020-03-13 11:09 被阅读0次

    今天测试提出一个bug,说在列表页下拉刷新的时候,同时请求了两次接口,一次pageNum=1,一次pageNum=2,并且调用顺序有时候pageNum=1在前,有时候pageNum=2在前,偶尔出现这种情况,就去排查了一下代码:
    这是我统一封装的BaseViewController里面设置下拉加载上拉刷新的方法:

    /// 设置页面上拉加载下拉刷新
    /// @param VC 页面控制器
    /// @param tableView 表视图
    /// @param method 刷新或加载数据方法
    /// @param trigger 提前加载百分比
    - (void)setupMJRefreshWithVC:(RRBaseViewController *)VC tableView:(RRBaseTableView *)tableView method:(SEL)method trigger:(CGFloat)trigger {
        MJRefreshNormalHeader *header = [[MJRefreshNormalHeader alloc] init];
        [header setRefreshingBlock:^{
            VC.pageNumber = 1;
            VC.totalPages = 1;
            if ([VC respondsToSelector:method]) {
                ((void (*)(id, SEL))[VC methodForSelector:method])(VC, method);
            }
        }];
        tableView.mj_header = header;
        MJRefreshAutoNormalFooter *footer = [[MJRefreshAutoNormalFooter alloc] init];
        footer.triggerAutomaticallyRefreshPercent = trigger;
        @WEAKOBJ(footer);
        [footer setRefreshingBlock:^{
            @STRONGOBJ(footer);
            if (VC.pageNumber < VC.totalPages) {
                VC.pageNumber += 1;
                if ([VC respondsToSelector:method]) {
                    ((void (*)(id, SEL))[VC methodForSelector:method])(VC, method);
                }
            } else {
                [footer endRefreshingWithNoMoreData];
            }
        }];
        tableView.mj_footer = footer;
    }
    

    发现footer有一个triggerAutomaticallyRefreshPercent属性,用来在页面未触底之前做提前刷新用的,我平时设置的值是-20.f,排查过程中发现当设置值小于0时,会偶尔出现上述问题,值越小,出现上述问题的几率就越大,于是去github看有木有遇到同样问题的,发现了一个pull request
    ,解决了我的问题,感谢作者!
    解决方案:
    在下述文件新增一行就可以了

    /// MJRefreshAutoFooter.m
    - (void)scrollViewContentOffsetDidChange:(NSDictionary *)change
    {
        [super scrollViewContentOffsetDidChange:change];
        
        if (self.state != MJRefreshStateIdle || !self.automaticallyRefresh || self.mj_y == 0) return;
        
        if (_scrollView.mj_insetT + _scrollView.mj_contentH > _scrollView.mj_h) { // 内容超过一个屏幕
            // 这里的_scrollView.mj_contentH替换掉self.mj_y更为合理
            if (_scrollView.mj_offsetY >= _scrollView.mj_contentH - _scrollView.mj_h + self.mj_h * self.triggerAutomaticallyRefreshPercent + _scrollView.mj_insetB - self.mj_h) {
                // 防止手松开时连续调用
                CGPoint old = [change[@"old"] CGPointValue];
                CGPoint new = [change[@"new"] CGPointValue];
                if (new.y <= old.y) return;
                /// MARK: 解决triggerAutomaticallyRefreshPercent设置小于0时引发header,footer同时刷新的问题
                if (new.y <= 0) return;
                /// end mark
                
                // 当底部刷新控件完全出现时,才刷新
                [self beginRefreshing];
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:2020-03-13 MJRefresh使用过程中出现的问题

          本文链接:https://www.haomeiwen.com/subject/bfqqshtx.html