美文网首页Swift深入学习iOS键盘上的鼓手
[最新版]MJRefresh解析与详细使用指导

[最新版]MJRefresh解析与详细使用指导

作者: PPAbner | 来源:发表于2016-06-17 00:41 被阅读54809次

推荐一下: iOS链式创建UI终结者 ➜ PPMaker 2018-05-10


注意

上拉和下拉的刷新控件都会显示,如果没有网的时候就两个都显示的解决办法,详细见评论41楼

生活要多点蛋定

俗话说 “工欲善其事,必先利其器”,好的成熟的第三方,是我们开发路上的利器;俗话又说“君子生非异也,善假于物也”NB的人并不是生下来就和别人不一样,只是他们擅于使用工具罢了!,熟练使用这些第三方,你就是开发者的"君子"!

本篇旨在更详细指导怎么使用对应的第三方,不会过多说明第三方怎么实现!就像你买了部新手机,说明书只说明怎么使用(及注意事项),并不说明手机由什么构造以及怎么制造!
PPDemos地址
注意demo用的是3.1.2版本,运行可能出现Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSTaggedPointerString substringToIndex:]: Index 9223372036854775807 out of bounds; string length 2',请更新到最新就好了2016--07--04

一. 新旧版本比较

旧版本使用说明

#import "UIScrollView+MJRefresh.h"
/**
 MJ友情提示:
1. 添加头部控件的方法
[self.tableView addHeaderWithTarget:self action:@selector(headerRereshing)];
或者
[self.tableView addHeaderWithCallback:^{ }];
 2. 添加尾部控件的方法
 [self.tableView addFooterWithTarget:self action:@selector(footerRereshing)];
 或者
 [self.tableView addFooterWithCallback:^{ }];
3. 可以在MJRefreshConst.h和MJRefreshConst.m文件中自定义显示的文字内容和文字颜色
4. 本框架兼容iOS6\\\\iOS7,iPhone\\\\iPad横竖屏
5.自动进入刷新状态
1> [self.tableView headerBeginRefreshing];
2> [self.tableView footerBeginRefreshing];
6.结束刷新
1> [self.tableView headerEndRefreshing];
2> [self.tableView footerEndRefreshing];
*/

新版本介绍version= '3.1.5',2016-06-13
1.添加前缀mj_;
2.支持国际化zh-Hans(简体中文),zh-Hant(繁体中文),en(英文)
3.可以自定义刷新控件
4.更加自由化,支持文字,图片,GIF等混合搭配(有点扯

最新的MJRefresh的GitHub仓库截图如图mj-01:

图mj-01 MJRefresh的GitHub仓库截图

二.MJRefresh解析

1 . MJRefresh的框架图如图mj-02:

图mj-02 MJRefresh的框架图
2 . MJRefresh的框架图梳理
作用
MJRefreshComponent 继承自UIView,最基本的刷新类
MJRefreshHeader 最基本的下拉刷新类
MJRefreshStateHeader 可以下拉刷新,但是只有文字
MJRefreshNormalHeader 默认的刷新样式,有文字,有上下箭头,有菊花

抱歉说下:上面MJ的框架图说的已经很详细了,具体的上拉加载更多就不写了

3 . MJRefresh使用技巧或建议

3.1 无论是下拉刷新还是上拉加载,都最好使用图mj-02分支最后面的某一个,因为越后面分工越详细,刷新控件处理的越细致;

3.2 自定义刷新控件,后面有讲解

三 .MJRefresh详细使用指导所有说明都配合代码讲解

① MJRefresh默认下拉刷新上拉加载

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    //默认【下拉刷新】
    self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(refresh)];
    //默认【上拉加载】
    self.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMore)];
}
-(void)refresh
{
    [self getNetworkData:YES];
}
-(void)loadMore
{
    [self getNetworkData:NO];
}

② MJRefresh默认下拉刷新上拉加载【使用Block方法】

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    __weak typeof(self) weakSelf = self;
    //默认block方法:设置下拉刷新
    self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
        [weakSelf getNetworkData:YES];
    }];
    
    //默认block方法:设置上拉加载更多
    self.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
        //Call this Block When enter the refresh status automatically
        [weakSelf getNetworkData:NO];
    }];

}

③ MJRefresh更自定义化的下拉刷新上拉加载

  1. 动画图片样式;
  1. 隐藏刷新控件状态或者时间样式;
  2. 自定义刷新状态和刷新时间文字样式【当然了,对应的Label不能隐藏】
- (void)viewDidLoad {
    [super viewDidLoad];
    //样式一:设置一张图片(无动画效果)
//    NSArray *idleImages = [NSArray arrayWithObject:[UIImage imageNamed:@"xiala_icon.png"]];
    //样式二:设置多张图片(有动画效果)
    NSArray *idleImages = [NSArray arrayWithObjects:
                           [UIImage imageNamed:@"dropdown_loading_01.png"],
                           [UIImage imageNamed:@"dropdown_loading_02.png"],
                           [UIImage imageNamed:@"dropdown_loading_03.png"],nil];

    NSArray *pullingImages = [NSArray arrayWithObject:[UIImage imageNamed:@"shifang_icon.png"]];
    NSArray *refreshingImages = [NSArray arrayWithObjects:
                                 [UIImage imageNamed:@"load_view_01.png"],
                                 [UIImage imageNamed:@"load_view_02.png"],
                                 [UIImage imageNamed:@"load_view_03.png"],
                                 [UIImage imageNamed:@"load_view_04.png"],
                                 [UIImage imageNamed:@"load_view_05.png"],
                                 [UIImage imageNamed:@"load_view_06.png"],
                                 [UIImage imageNamed:@"load_view_07.png"],
                                 [UIImage imageNamed:@"load_view_08.png"],
                                 [UIImage imageNamed:@"load_view_09.png"],
                                 [UIImage imageNamed:@"load_view_010.png"], nil];

//    MJRefreshGifHeader *header = [MJRefreshGifHeader headerWithRefreshingTarget:self refreshingAction:@selector(animationRefresh)];
    
    //-------以下是使用block方法【不包含animationRefresh方法】,动画设置在上面的部分代码---------
    
    __weak typeof(self) weakSelf = self;
    MJRefreshGifHeader *header = [MJRefreshGifHeader headerWithRefreshingBlock:^{
        [weakSelf getNetworkData:YES];
    }];
    
    //-------以上是使用block方法【不包含animationRefresh方法】,动画设置在上面的部分代码---------
    
    //1.设置普通状态的动画图片
    [header setImages:idleImages forState:MJRefreshStateIdle];
    //2.设置即将刷新状态的动画图片(一松开就会刷新的状态)
    [header setImages:pullingImages forState:MJRefreshStatePulling];
    //3.设置正在刷新状态的动画图片
    [header setImages:refreshingImages forState:MJRefreshStateRefreshing];
    
    self.tableView.mj_header = header;
    
#pragma mark --- 下面两个设置根据各自需求设置
//    // 隐藏更新时间
//    header.lastUpdatedTimeLabel.hidden = YES;
//    
//    // 隐藏刷新状态
//    header.stateLabel.hidden = YES;
   
#pragma mark --- 自定义刷新状态和刷新时间文字【当然了,对应的Label不能隐藏】
    // Set title
    [header setTitle:@"Pull down to refresh" forState:MJRefreshStateIdle];
    [header setTitle:@"Release to refresh" forState:MJRefreshStatePulling];
    [header setTitle:@"Loading ..." forState:MJRefreshStateRefreshing];
    
    // Set font
    header.stateLabel.font = [UIFont systemFontOfSize:15];
    header.lastUpdatedTimeLabel.font = [UIFont systemFontOfSize:14];
    
    // Set textColor
    header.stateLabel.textColor = [UIColor redColor];
    header.lastUpdatedTimeLabel.textColor = [UIColor blueColor];
    
}
#pragma mark --- "动画图片"样式的非block方法
-(void)animationRefresh
{
    [self getNetworkData:YES];
}

④ MJRefresh完全自定义化的下拉刷新上拉加载

④-1. 最终调用

- (void)viewDidLoad {
    [super viewDidLoad];
    //MJRefresh自定义刷新控件
    __weak typeof(self) weakSelf = self;
    self.tableView.mj_header = [MJDIYHeader headerWithRefreshingBlock:^{
        [weakSelf getNetworkData:YES];
    }];
}

④-2. 完全自定义的下拉刷新控件上拉暂还没看

更多信息请参看MJDIYHeade.m
更多信息请参看MJDIYHeade.m
更多信息请参看MJDIYHeade.m
(嘿嘿,我错了,当然不能这样忽悠过了,请往下继续......)

④-3. 【附】:MJRefresh自定义刷新控件步骤(just 3 步)重要

说明:最好参考MJDIYHeader.m来学习,就不一一截图说明
① 首先创建一个类(譬如MJDIYHeader),继承自MJRefreshHeader;
② 重写相关方法 【 在MJRefreshComponent.h中有下面的提示】

#pragma mark - 交给子类们去实现
/** 初始化 */
#pragma mark 在这里做一些初始化配置(比如添加子控件)
-(void)prepare NS_REQUIRES_SUPER;
/** 摆放子控件frame */
#pragma mark 在这里设置子控件的位置和尺寸
-(void)placeSubviews NS_REQUIRES_SUPER;
/** 当scrollView的contentOffset发生改变的时候调用 */
-(void)scrollViewContentOffsetDidChange:(NSDictionary *)change NS_REQUIRES_SUPER;
/** 当scrollView的contentSize发生改变的时候调用 */
-(void)scrollViewContentSizeDidChange:(NSDictionary *)change NS_REQUIRES_SUPER;
/** 当scrollView的拖拽状态发生改变的时候调用 */
-(void)scrollViewPanStateDidChange:(NSDictionary *)change NS_REQUIRES_SUPER;

③ 调用!OK啦!嘿嘿!

四. 最后,上面的刷新和加载这么简单,等等,还有一点注意呢

下拉刷新 --- 获取最新数据;
上拉加载 --- 获取更多数据;

四-1. PPDemos中的刷新类都是继承自MJViewController的,所以在刷新和加载的类MJDefaultViewController,MJDefaultBlockViewController,MJAnimationImageViewController,MJCustomRefreshViewController中,只需要在viewDidLoad中调用即可;
四-2. MJViewController.h 父类的,子类都可以用

//
//  MJViewController.h
//  MJDemos
//
//  Created by Abner on 16/6/13.
//  Copyright © 2016年 PPAbner. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface MJViewController : UIViewController
{
    int page;
    BOOL isFirstCome; //第一次加载帖子时候不需要传入此关键字,当需要加载下一页时:需要传入加载上一页时返回值字段“maxtime”中的内容。
    int totalPage;//总页数
    BOOL isJuhua;//是否正在下拉刷新或者上拉加载。default NO。
}
@property(nonatomic,strong)NSMutableArray *pictures;
@property(nonatomic,strong)UITableView *tableView;
/** maxtime */
@property(nonatomic,copy)NSString *maxtime;
/**
 *  获取网络数据
 *  @param isRefresh 是否是下拉刷新
 */
-(void)getNetworkData:(BOOL)isRefresh;

@end

四-3. MJViewController.m

//
//  MJViewController.m
//  MJDemos
//
//  Created by Abner on 16/6/13.
//  Copyright © 2016年 PPAbner. All rights reserved.
//  

#import "MJViewController.h"
#import "MJPicture.h"

@interface MJViewController ()<UITableViewDelegate,UITableViewDataSource>

@end

@implementation MJViewController
-(void)viewWillDisappear:(BOOL)animated
{
    isFirstCome = YES;
}
//一进来就让自动刷新
-(void)viewWillAppear:(BOOL)animated
{
    [self.tableView.mj_header beginRefreshing];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    page = 0;
    isFirstCome = YES;
    isJuhua = NO;
    [self creatUI];
}
/**
 *  停止刷新
 */
-(void)endRefresh{
    
    if (page == 0) {
        [self.tableView.mj_header endRefreshing];
    }
    [self.tableView.mj_footer endRefreshing];
}
-(void)creatUI
{
    self.tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, ScreenWidth, ScreenHeight) style:UITableViewStylePlain];
    self.tableView.delegate =self;
    self.tableView.dataSource =self;
    [self.view addSubview:self.tableView];
    self.tableView.tableFooterView = [UIView new];
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
      
}
-(void)getNetworkData:(BOOL)isRefresh
{
    if (isRefresh) {
        page = 0;
        isFirstCome = YES;
    }else{
         page++;
    }
    
    NSString *url;
    if (isFirstCome) {
        url = [NSString stringWithFormat:MissBaisiImageUrl,@"",page];
    }else{
        url = [NSString stringWithFormat:MissBaisiImageUrl,self.maxtime,page];
    }
//    [HYBNetworking cacheGetRequest:YES shoulCachePost:YES];
    [HYBNetworking getWithUrl:url refreshCache:NO params:nil progress:^(int64_t bytesRead, int64_t totalBytesRead) {
       
    } success:^(id response) {
        PPLog(@"请求成功---%@",response);
        [self endRefresh];
        isJuhua = NO; //数据获取成功后,设置为NO
        
        NSDictionary *dict = (NSDictionary *)response;
        NSDictionary *infoDict = [dict objectForKey:@"info"];
        totalPage = (int)[infoDict objectForKey:@"page"];
        self.maxtime = [infoDict objectForKey:@"maxtime"];
        
        if (page == 0) {
            [_pictures removeAllObjects];
        }
        //判断是否有菊花正在加载,如果有,判断当前页数是不是大于最大页数,是的话就不让加载,直接return;(因为下拉的当前页永远是最小的,所以直接return)
        if (isJuhua) {
            if (page >= totalPage) {
                [self endRefresh];
            }
            return ;
        }
        //没有菊花正在加载,所以设置yes
        isJuhua = YES;
        //显然下面的方法适用于上拉加载更多
        if (page >= totalPage) {
            [self endRefresh];
            return;
        }
        //获取模型数组
        NSArray *pictureArr = [dict objectForKey:@"list"];
        for (NSDictionary *dic in pictureArr) {
            MJPicture *picture = [[MJPicture alloc]init];
            [picture setValuesForKeysWithDictionary:dic];
            [self.pictures addObject:picture];
        }
        [self.tableView reloadData];
        //获取成功一次就判断
        isFirstCome = NO;
        
        
    } fail:^(NSError *error) {
        PPLog(@"请求失败---%@",error);
    }];
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return _pictures.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    if (!cell) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }

    MJPicture * picture = _pictures[indexPath.row];
    cell.textLabel.text = picture.name;
    cell.detailTextLabel.text = picture.passtime;
    [cell.imageView sd_setImageWithURL:[NSURL URLWithString:picture.profile_image]];
    return cell;
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(NSMutableArray *)pictures
{
    if (_pictures == nil) {
        _pictures = [NSMutableArray array];
    }
    return _pictures;
}

@end

结束语:最初自己在简书上转载别人的文章MJRefresh实现刷新(使用它的Block方法),看到有好多阅读量,并且还有小伙伴问我,自己也一直说更新,但没有更新,6月13号刚好有空,就去下了最新的MJRefresh准备自己写篇使用指导,下午快下班的时候遇到MJRefresh国际化的bug,在Issues了MJ后,bug被当晚解决了,14号早上也是收到MJ的邮件,非常开心!!!为开源点赞,也要做贡献!
最后附上一张图,iOS开发我的偶像吧,算是!激励自己而已!

MJ邮件我和另一哥们

2016--06--17 00:37:10,晚安!

相关文章

网友评论

  • 微小的沙土:如何设置上拉不自动刷新,也隐藏footer,上拉显示出来文字等等,然后到一定程度松开执行方法,就跟下拉一样,这个要咋弄,自定义吗?我用MJRefreshFooter没反应。。。auto都跑出来了还自动刷新,求方法
    微小的沙土:@PPAbner 这个知道了,还没上架。。。
    微小的沙土:@PPAbner 不急,你下班回家帮我看看,我想实现的功能就是上拉跟下拉一样的位置,不要一滑到底直接上拉,然后可以设置文字就可以了!谢谢你
    PPAbner:@UnknownError 兄弟,急需吗?马上下班了,今晚回家赶路,我抽空给你看,尽快,好吧!
  • 3fdb581ec682:感谢大神的分享,我也遇到这个语言问题,怎么上啦和下拉都是英文,怎么让他默认都是中文,需要在Xcode里面设置吗?还是需要在代码里面设置,谢谢
    PPAbner:@南海一页扁舟 跟你手机设置的语言有关,不用自己去配置。(如果你的app确定都必须是中文的,你可以MJRefresh--->Resources--->MJRefresh.bundle下的en.lproj、zh-Hant.lproj里面的东西用zh-Hans.lproj里面的完全替换)
  • 6cddee706b65:你好,我的列表页的上推加载不是顺位加载,而是 直接顶出几个cell,这是什么原因造成的?
  • 芷依儿:iOS11,这个endFresh结束刷新的方法不管用了,结束不了,一直刷新,tableview不是全屏,求大神指点…
  • 菜鸟2014:为啥demo下载后无法解压???
    PPAbner:@菜鸟2014 好的
    菜鸟2014:@PPAbner 我试了一下还不行,麻烦你发一下我邮箱1963991069@qq.com,非常感谢。。。
    PPAbner:@菜鸟2014 刚试了下,可以下载解压
  • TitanCoder:请教一下,tableVIew添加了自定义的tableHeaderView,如何在设置mj_header?????
    PPAbner: UIView *tableHV = [[UIView alloc]initWithFrame:CGRectMake(0, 0, kScreenWidth, 80)];
    tableHV.backgroundColor = [UIColor redColor];
    self.tableView.tableHeaderView = tableHV;

    //默认【下拉刷新】
    self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(jr_headerRefresh)];
    [self.tableView.mj_header beginRefreshing];
    // 设置自动切换透明度(在导航栏下面自动隐藏)
    self.tableView.mj_header.automaticallyChangeAlpha = YES;

    不影响你自定义tableHeaderView,mj_header默认放在你自定义的tableHeaderView前。源码如下:[self insertSubview:mj_header atIndex:0];
  • 王玉朝:下拉时候我想让他停留两秒 应该怎么设置?求解 谢谢
    PPAbner:@王玉朝 参考下官方的demo里面的延时操作,把时间设置为两秒,然后再调用对应的header的engrefreshing方法。
  • 洁简:刚进来就刷新怎么弄得
    PPAbner:@洁简 //默认【下拉刷新】
    self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(jr_headerRefresh)];
    [self.tableView.mj_header beginRefreshing]; 就是调beginRefreshing方法
  • Frey丶:大神,我想问下. 下拉时候的时间那一行怎么自定制. 就是时间显示我该怎么做才能调整
    PPAbner:@Frey丶 明天到公司我给你看看。
  • LiYaoPeng:大神,请问如果我想改变下拉刷新的gif图的播放速度,该怎么改呀~
    PPAbner:@LiYaoPeng 刚好这回在线,兄弟,看下http://www.jianshu.com/p/157ff186b8df,感兴趣不,目前已联系4人,他们说的都是500以内,能接受,看看吧!嘿嘿
    LiYaoPeng:@PP_Abner 好的,万分感谢,恢复这么快~ 谢谢了。
    PPAbner:@LiYaoPeng 你确定是gif图了?还是用的uiimageView的animationImages属性修改,如果是生成好的gif,暂时没有方法,只能重新制作一个,如果是另一种的话控制下animationDuration就好
  • nil_C:宝贝
    MJRefreshStateWillRefresh和MJRefreshStateNoMoreData这两种状态在什么时候触发啊!~
  • 乐视薯片:你好,请问一下,MJRefresh 已更新到最新版本,还是报错:'*** -[NSTaggedPointerString substringToIndex:]: Index 9223372036854775807 out of bounds; string length 2'
    真机上没有问题,模拟器就会报这个错,怎么解决啊
    PPAbner:@初心_媛 605708376
    乐视薯片:@PP_Abner 太长了,发不过去,方便给一下你的qq吗
    PPAbner:你把你控制台具体打印的信息发我,简信发我也行,我看下!(你的这个错误是说字符串越界,但我不确定具体哪里)
  • Apel0811:框架的下拉刷新都是定位到表视图的最上方,能不能实现像上拉加载那种加载玩数据表视图没有位移的效果,就像QQ和微信那样上拉聊天记录的效果,
  • e8aca1b2664c:你好,请问这个工具,能在 table 自定义了 headerView 的情况下有视觉上的效果吗?我现在是 tableView 的 tableHeaderView 被赋值了我自定义的一个 View,同时也使用 mjrefresh 来进行下拉刷新的操作,功能是有起作用的,但是下拉刷新的 UI 效果没有出现。
    e8aca1b2664c:@PP_Abner 谢谢,我测试了一下,是可以的
    PPAbner:@岑先生_4885 应该有吧,你把你这个界面简单的集成个demo,下午有空给你看看!chinesemanbobo@163.com
  • 001cb51446ab:大神,我这不算挖坟吧,我也有个问题请教一下,您有空的时候帮我看看.self.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreTopics)];在viewdidload调用这个方法时如果第一次运行程序,上拉和下拉的刷新控件都会显示,如果没有网的时候就两个都显示,我现在就个折中的解决办法,让footer延迟几秒再添加,或者当cell已经有数据的时候再加载footer,请问大神你平时怎么解决这个问题?感激不尽!
    PPAbner:@生活要多点蛋定 #warning 这个属性很重要(更多的footer使用指导,可以参考作者本身的demo中的example15---example19,相信对你有所帮助!!!也非常感谢你的咨询,让我更深层次的理解这个框架!!!)【上面两局代码确实在没有数据的时候会都显示,但是下面这个属性可以很好解决这个问题!!!说实话,在之前,我也以为没数据的时候只会显示header,实际上我也错了❌,所以在此感谢!!!】
    /** 自动根据有无数据来显示和隐藏(有数据就显示,没有数据隐藏。默认是NO) */
    self.tableView.mj_footer.automaticallyHidden = YES;
    001cb51446ab:@PP_Abner 已经发给你了, 你有空帮我看看,谢谢
    PPAbner:你好!!!早上一到公司就给你看这个问题,按照你说的,我测试,并未出现你的情况,麻烦你把自己的问题简单整理个demo,发我邮箱chinesemanbobo@163.com,我中午尽快给你看看什么问题!!!
  • e0ec72284212:大神,请教一下,如何做到,刷新时,只显示菊花动画,其他的都不要呢?
    e0ec72284212:@PP_Abner 非常感谢,早已解决~
    PPAbner:抱歉,回复的晚了!!!最近一直赶进度,平时星期天了又不想弄,非常抱歉!!!希望你早已解决了!!
    PPAbner: //默认【下拉刷新】

    MJRefreshNormalHeader *nomalHeader = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(refresh)];
    self.tableView.mj_header = nomalHeader;
    nomalHeader.lastUpdatedTimeLabel.hidden = YES;
    nomalHeader.stateLabel.hidden = YES;

    里面有lastUpdatedTimeLabel和stateLabel这样的属性,控制显隐就好!!!
  • 小强很生气:用了下拉刷新gif添加图片后 gifView的contentMode设置无效 图片被裁减了显示不全
  • 这个汤圆没有馅:demo网址点进去报了404的错 :broken_heart:
    这个汤圆没有馅:@PP_Abner 可以了呢 谢谢 :+1:
    PPAbner:@汤了个圆 https://github.com/chinesemanbobo/PPDemo,我刚试了,没问题
  • 60a18ece98ee:大神 ,demo下不了
    PPAbner:@60a18ece98ee https://github.com/chinesemanbobo/PPDemo,试下,我这边好的!!
  • aiq西米:至少附个github地址啊,喝水不忘挖井人!
    PPAbner:@aiq西米 教训的是!
  • narutog17:加载完数据之后 mj_header 就自动上移隐藏了,想问问,可以让这个mj_header 先提示 已跟新XX 条数据 再上移隐藏么?
    PPAbner:@narutog17 你想实现类似新浪微博的效果,个人觉得可以实现,但不去修改mjrefresh源码,只是在自己数据加载完成后去判断有XX条更新,然后用个弹窗提示下!!
  • PPAbner:亲们,抱歉最近不能及时来回复大家的问题啦,如果有谁看到上面有提问,而自己可以回答的,麻烦帮回一下,不胜感激!!!
  • lin_xiaohuan:大神,问个问题,我用默认底部,加载数据他只回调1次耶
    PPAbner:@lin_xiaohuan 明天给你看看,今天不在家
  • scscsc:大神 我想问下 怎么修改下拉刷新时 更新时间 那一行的内容?
  • 取瓢祸水饮:为什么我一使用MJ程序就会卡
    PPAbner:@取瓢祸水饮 确定?第一次听说你的问题!你把你的界面抽出去,然后用刷新
  • x了个w:亲,我今天用cocoapods为何不能升级到3.1.2以上的版本啊,我是为了解决国际化语言问题,想做个升级
    PPAbner:@进化猿 这个我也不清楚,可以去github问问。抱歉!我们是手动挡!
  • 07e61217c6fc:我是一个oc菜鸟,学习到了很多
  • 路这么长:大神大神 MJRefresh 在6sPlus下 报错: [NSTaggedPointerString substringToIndex:]: Index 9223372036854775807 out of bounds; string length 2 这个应该怎么解决 :pray: :pray: :pray:
    路这么长:@PP_Abner ~ 更新以后 好了
    PPAbner:@路这么长 要不你把库更新下试试,我重启一下电脑,运行木问题。
    PPAbner:@路这么长 不好意思,自己模拟器今天怎么也走不起来,晚上回去用自己电脑试一试,不过看错误,是字符串截取过长。
  • 746d18d613d4:现在最新版本才3.1.0的吧,你的怎么会是3.1.2的呢,我现在使用swift3.0通过pod 安装MJ,一切都正常,编写了一个简单的下拉刷新功能,编译正常通过,但模拟器上运行的时候就报这一段代码错误,2016-10-15 15:21:32.609 dBuy[31380:1921277] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSTaggedPointerString substringToIndex:]: Index 9223372036854775807 out of bounds; string length 2'
    *** First throw call stack:
    你上面提到下载最新版,我现在使用的版本是3.1.0的,没有找到你所提及的3.1.2以上的版本,希望关照下我们这些swift们 :cold_sweat:
    PPAbner:@心菜 刚看到了一个你的问题的答案,我之前没有及时追踪MJRefresh,不知道作者更新库没有,你看看这个关于MJRefresh 的那条,对你有用!http://www.cnblogs.com/oc-bowen/p/5916630.html
    PPAbner:@心菜 至于你说的最新3.1.0,我也郁闷,你看我文章最后的邮件截图已经3.1.3了,而刚刚我看的是3.1.8了(https://github.com/CoderMJLee/MJRefresh/commit/24008cf13f089893f45f3675a3ed28dcb5c3861e),至于Swift,我从没用过,只能同希望作者出个swift的或者更好支持swift的,不过可以看下(https://github.com/CoderMJLee/MJRefresh/commit/24008cf13f089893f45f3675a3ed28dcb5c3861e)这个,还有,有问题,可以看相关issues,看有没有同样的问题!
  • 2a9d4a27ad47:吊吊哒,学习了 。。。
  • 343cea0f7107: 下拉刷新 能像 上拉加载一样 ,到顶部自动触发而不用一个很长的拖拽距离嚒?
    PPAbner:@JcccZ 不能吧,不过有自动,你可以检测偏移量,让它自动刷新!机制就是uiscrollview的类目
  • Rickie_Lambert: :disappointed_relieved: 大神的demo里面 集成了这么多功能的啊!!
    Rickie_Lambert:@PP_Abner :+1: 恩, 先把工作 忙完
    PPAbner:@Mr_Rain 哈哈,没事研究研究!不多,现在在看mjextension源码,这几天公司项目要赶在十一前出来,过了十一把看的心得及理解分享出来!
  • bf544aca9a15:请问一下,手机语言调成了繁体中文(香港),怎么上下拉刷新展示的全是英文。真机调试
    PPAbner:@胡不弍 这些,只需要模拟器或者真机语言改变不需要代码操作!
    PPAbner:@胡不弍 我刚刚在模拟器上跑了下,可以,但是你给说真机,我手机升10,公司模拟器没升,所以你把MJRefresh升最新,如果还是不行,可以去git上看看issues,或者直接提个issue
  • f92c6bb7dd59:大腿你好 我想在mj的基础上做一个类似微信朋友圈的下拉刷新 可以指导下吗
    PPAbner:@Wnjhon 抱歉呀!其实我也不是大牛!嘿嘿!在学习
    f92c6bb7dd59:@PP_Abner ..好吧
    PPAbner:@Wnjhon 没想过,为你的想法点赞!忙我只能帮你的就是去理解你有的困惑,有空我也尝试,最近在看mjextension源码,有空看看这个源码,把你的想法实践下!嘿嘿
  • 大学霸:怎么修改刷新图片的imageView的大小
    ?很急
    PPAbner:@40103e53b0e9 到MJRefreshNormalHeader.m的77行,修改self.arrowView.mj_size = self.arrowView.image.size;为self.arrowView.mj_size = CGSizeMake(50, 60);【具体的值你自己设置,但是图片不能过大,过大超过控件高就不好了,具体的我也没有细究】,而你想设置,可以在此基础上加以运用拓展!
  • 剁椒鱼尾:循环引用的问题怎么解决?
    __weak typeof(self) weakSelf = self;
    加了上面这句话,block里用weakSelf 调用刷新方法,可是页面退出时,dealloc还是不走。
    剁椒鱼尾:@百川东到海 :sweat: 已经找到了,block方法里 除了 调用了刷新方法,还有NSInteger page的点方法,也要 用weakSelf调用
  • 8c8c9760d2b9:请教您一个问题:
    如果加载的是最后一页,就执行方法endRefreshingWithNoMoreData,但是“已经加载全部数据”的字样只显示了一下就过去了。

    请问 如何在 加载到最后一页时让底部文字“已经加载全部数据”长期显示
    PPAbner:@lisary 当前页等于和大于总页数时调用`noticeNoMoreData `方法如下:
    ```
    #pragma mark - 上拉加载更多
    -(void)loadMoreSearchResult
    {
    if (self.currentPage < [self.totalPage integerValue]) {
    self.currentPage++;
    self.isLoadMore = YES;
    [self getDataTwo];
    }else{
    [self.collectionView.footer noticeNoMoreData];
    }
    }
    ```
  • ShenYj:3.1 无论是下拉刷新还是上拉加载,都最好使用图mj-01分支最后面的某一个,因为越后面分工越详细,刷新控件处理的越细致;

    是不是应该指配图mj-02
    PPAbner:@ShenYj 已改正,谢了!
  • Seeea海:楼主你好,想请问下刷新的时候数据要取到 归档到本地的数据 要怎么刷新呢
    PPAbner:@Seeea海 跟我给你说的一样,把本地数据库的信息当做网络请求的结果加载出来。不走网络请求!就是没网了也能有数据!下拉刷新无非就是从本地取,再展示出来。
    Seeea海:@PP_Abner 不是。。是我直接进行操作将一些数据存放到了本地,我操作完后想进行刷新页面(就可以加载我刚刚存到本地的数据了),但是不知道该如何刷新
    PPAbner:@Seeea海 按照你网络拉去下来的解析数据格式解析!通俗点说就是,你存的是数组,就取数组,存的字典就取字典,也可以是模型!!!一般刷新拉取最新数据,断网或者网络延时太长,为了界面不空荡荡就加载本地缓存的数据!也就是你说的本地刷新,不知道是不是你说的这意思?
  • MRNAN_:demo 的地址失效了
    MRNAN_:@PP_Abner 好了,谢谢了啊
    PPAbner:@非我非非我91 刚看了,好了!
  • teanfoo:你好!有2个问题想请教一下:

    1. 在 "下拉可以刷新 <---> 松开立即刷新" 之间切换的时候会出现一个空白的、什么也不显示状态、,有什么方法避免吗?
    2. 下拉刷新 “MJRefreshNormalHeader” 类可以修改箭头的位置吗?我在初始化的时候设置arrowView.center,但是没有效果。

    请赐教,甚感激!
    PPAbner:@teanfoo 嗯嗯!棒棒!:+1:
    teanfoo:@PP_Abner 谢谢你的回复、
    1. 这个问题已经解决了、出现这种问题的原因可能是因为我是用tableView.tableHeaderView去接收的MJRefrenshNormalHeader的对象、而不是tableView.mj_header。
    2. 这个问题也解决了、我是修改的MJRefrenshNomalHeader的第65行,那个100就是相对中心位置向左的偏移量;但是我感觉这样做是治标不治本的,因为所有的刷新控件会改变。如你有了其他更好的解决方案,样告知!
    PPAbner:@teanfoo 不好意思,最近比较忙,简书回复的少,今天周末有空,第一个问题,我没遇到过,自己也是看到了测试好多遍,没遇到;第二个问题,可以修改,你在MJRefreshNormalHeader.m文件 line 62的CGFloat arrowCenterX = self.mj_w * 0.5;修改为CGFloat arrowCenterX = self.mj_w * 0.6;运行,会看到箭头向右移动了!!
  • 951bb715bff7:大神你好,我用MJRefreshNormalHeader headerWithRefreshingBlock:下拉刷新的时候,tableView无法滑动了,怎么回事?
    PPAbner:@jsonHao 抱歉,回复的晚了,不过你的问题,真没遇到过,可以给MJ提下!!!
    teanfoo:@jsonHao 可能是你设置了tableview的bounce为NO
  • 超_iOS:这个版本必须判断菊花的有无吗
    PPAbner:@李二超 对!因为你的一个事件已经完成了,只是数据失败了!
    超_iOS:@PP_Abner 数据请求失败后似不似还要停止菊花啊.?
    PPAbner:@李二超 菊花根据需求
  • FDZero:写的很好,感谢!不过我昨天遇到了一个问题就是如果我给tableView设置了tableHeaderView,那么tableHeaderView会覆盖掉刷新控件的视图,当然刷新控件的block还是执行了。后来,用[_tableView bringSubviewToFront:_tableView.mj_header]方法强行将刷新视图带到顶层,我想问有没有更好的方法能够兼容刷新视图和表头视图?
    FDZero:@PP_Abner 因为我是仿照的百度贴吧写的头视图,可能是因为图片缩放盖住了刷新控件,如果没有设置图片的缩放那么刷新控件正常显示
    PPAbner:@FDZero 代码MJDefaultViewController.m中line 27-30为你测试了你的情况,没有问题,如果真的遇到,你的方法确实可以,也挺好,但是个人觉得,最好打开XCode的图层关系,看下怎么回事!!!抱歉回复晚了!!【顺便说下,好多APP首页都是tableHeaderView放的轮播图】
    teanfoo:@FDZero 刷新控件就是放在表头视图、你可以尝试将你自己想要显示的表头视图放到组头视图中显示。
  • 1f9c84643238:大神。Demo下载不了。。求。。。
    PPAbner:@Crayon丶 好的!你等下
    1f9c84643238:@PP_Abner 给个链接我好吗。。我这边github貌似打不开来,谢谢啦,实在不行可以发我邮箱,483443553@qq.com,万分感谢。
    PPAbner:@Crayon丶我刚试了,可以下载!也可以运行!你再试一试!
  • 84df298b2705:+ (UIImage *)mj_arrowImage;
    这句话报编译错误是怎么搞得
    84df298b2705:@FDZero 谢谢啦,自己解决了,没注意到有回复,哈哈
    FDZero:@yanxitao 我之前也遇到过是因为一开始下载mjrefresh是用的pod下载的,然而写demo的时候直接从之前的pod里面把mjrefresh show in finder的文件夹拖到了Demo里面就会报这个错,你在这个类里面导入uikit框架就行了
    PPAbner:不清楚,是不是mj本身更新的原因?你看下github的issue
  • 知行合一认知升级:666666 perfect
    PPAbner:@慢跑20 有用就好
  • xxxixxxx:tableView发生了偏移 ,并且不能下拉刷新了。
    teanfoo:@拾荒少年v
    // 设置页面偏移:
    self.tabView.contentInset = UIEdgeInsetsMake(-MJRefreshHeaderHeight, 0, -MJRefreshFooterHeight, 0);

    另外,如果不显示组头视图和组尾视图的话,还得把组头视图和组尾视图的高度设置为0.1:
    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 0.1;
    }
    - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return 0.1;
    }
    xxxixxxx:@PP_Abner 不是,我自己写的。 知道为什么了,我设置了内容偏移
    PPAbner:@拾荒少年v demo吗?
  • 瑞廷:self.cTabview.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];//这行就报错,是最新的MJ啊
    -(void)loadNewData{

    page1 = 1;
    [_data removeAllObjects];
    [self requestConsult];
    }
    瑞廷:@PP_Abner 5楼就是报的错
    PPAbner:@瑞廷 //默认【下拉刷新】
    self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(refresh)];
    PPAbner:@瑞廷 我看了你的代码,没问题,能发下报的什么错?
  • 瑞廷:不知道为何
  • 瑞廷:[UITableView setMj_header:]: unrecognized selector sent to instance,有对应的方法,方法名也对,可是还报错
    70b7461fcbcb:你不能用UITableview去调用,得用_tableView去掉用
    瑞廷:@PP_Abner 这个就是报的错,我换成老版本了
    PPAbner:@瑞廷 不是UITableView类去调
  • 浪漫小牛:感谢大神的分享,另外请教大神一个问题,在使用MJ刷新的时候 视图向下偏移,刷新结束后不能回到正常的位置,找了好长时间了没找到解决方案
    PPAbner:@浪漫小牛 嗯嗯!支持!
    浪漫小牛:@PP_Abner 我尽快整理一份哈,好BUG一起分享
    PPAbner:@浪漫小牛 能发一份代码看下不,我从来没遇到这种问题!感觉是frame的问题!你看着视图底部的内容有没有显示出来「就是滑到底部有没有部分显不出来」!我也只是猜测!
  • PPAbner:嗯嗯!好样的!
  • 7f4bbad5097f:大神你好,请问MJRefresh国际化的问题怎么解决的,我在本地设置了本地化,MJRefresh刷新的时候还是英文啊。
    7f4bbad5097f:我搞定了,非常感谢。 :+1:
    7f4bbad5097f:@PP_Abner 好的,非常感谢。
    PPAbner:@大王加我来巡山 什么也不用做,MJRefresh会根据你的系统语言来自动判断的!「你手机中文的话,它就中文,你手机英文系统,它就英文系统。」等个一个小时,我再发个图文详情的说明!

本文标题:[最新版]MJRefresh解析与详细使用指导

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