美文网首页iOS开发技术真机相关iOS 开发
MJRefresh实现刷新(使用它的Block方法)

MJRefresh实现刷新(使用它的Block方法)

作者: PPAbner | 来源:发表于2015-11-15 22:45 被阅读67426次

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


    基于MJRefresh(3.1.4,2016-06-13版)更详细的使用指导。不建议再看此文
    [最新版]MJRefresh解析与详细使用指导


    出自iOS122
    如有侵权请留言删除,谢谢!

    //
    //  YFMVCPostListViewController.m
    //  iOS122
    //
    //  Created by 颜风 on 15/10/14.
    //  Copyright (c) 2015年 iOS122. All rights reserved.
    //
    
    #import "YFMVCPostListViewController.h"
    #import "YFArticleModel.h"
    #import <AFNetworking.h>
    #import <MJRefresh.h>
    #import <MBProgressHUD.h>
    #import "YFMVCPostViewController.h"
    
    @interface YFMVCPostListViewController ()<UITableViewDelegate, UITableViewDataSource>
    @property (nonatomic, strong) UITableView * tableView;
    @property (nonatomic, strong) NSMutableArray * articles; //!< 文章数组,内部存储AFArticleModel类型.
    @property (assign, nonatomic) NSInteger page; //!< 数据页数.表示下次请求第几页的数据.
    
    @end
    
    @implementation YFMVCPostListViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
    }
    
    - (NSMutableArray *)articles
    {
        if (nil == _articles) {
            _articles = [NSMutableArray arrayWithCapacity: 42];
        }
        
        return _articles;
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear: animated];
    
        // 马上进入刷新状态
        [self.tableView.header beginRefreshing];
    }
    
    - (UITableView *)tableView
    {
        if (nil == _tableView) {
            _tableView = [[UITableView alloc] init];
            
            [self.view addSubview: _tableView];
            
            [_tableView makeConstraints:^(MASConstraintMaker *make) {
                make.edges.equalTo(UIEdgeInsetsMake(0, 0, 0, 0));
            }];
            
            _tableView.delegate = self;
            _tableView.dataSource = self;
            
            NSString * cellReuseIdentifier = NSStringFromClass([UITableViewCell class]);
            
            [_tableView registerClass: NSClassFromString(cellReuseIdentifier) forCellReuseIdentifier:cellReuseIdentifier];
            
            _tableView.header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
                self.page = 0;
                
                [self updateData];
            }];
            
            _tableView.footer = [MJRefreshBackNormalFooter footerWithRefreshingBlock:^{
                [self updateData];
            }];
            
        }
        
        return _tableView;
    }
    
    /**
     * 更新视图.
     */
    - (void) updateView
    {
        [self.tableView reloadData];
    }
    /**
     *  停止刷新
     */
    -(void)endRefresh{
        [self.tableView.header endRefreshing];
        [self.tableView.footer endRefreshing];
    }
    /**
     *  更新数据.
     *
     *  数据更新后,会自动更新视图.
     */
    
    - (void)updateData
    {
        AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
        
        NSString * urlStr = [NSString stringWithFormat: @"http://www.ios122.com/find_php/index.php?viewController=YFPostListViewController&model[category]=%@&model[page]=%ld", self.categoryName, (long)self.page ++];
        
        [manager GET: urlStr parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
      
            [self endRefresh];
            
            if (1 == self.page) { // 说明是在重新请求数据.
                self.articles = nil;
            }
            
            NSArray * responseArticles = [YFArticleModel objectArrayWithKeyValuesArray: responseObject];
            
            [self.articles addObjectsFromArray: responseArticles];
            
            [self updateView];
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            [self endRefresh];
            
            MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
            hud.mode = MBProgressHUDModeText;
            hud.labelText = @"您的网络不给力!";
            [hud hide: YES afterDelay: 2];
    
        }];
    }
    
    # pragma mark - tabelView代理方法.
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        NSInteger number  = self.articles.count;
        
        return number;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSString * cellReuseIdentifier = NSStringFromClass([UITableViewCell class]);
        
        UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: cellReuseIdentifier forIndexPath:indexPath];
        
        YFArticleModel * model = self.articles[indexPath.row];
    
        NSString * content = [NSString stringWithFormat: @"标题:%@ 内容:%@", model.title, model.desc];
        
        cell.textLabel.text = content;
        
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        
        return cell;
    }
    
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        // 跳转到博客详情.
        YFArticleModel * articleModel = self.articles[indexPath.row];
        
        YFMVCPostViewController * postVC = [[YFMVCPostViewController alloc] init];
        
        postVC.articleID = articleModel.id;
        
        [self.navigationController pushViewController: postVC animated: YES];
    }
    
    @end
    
    

    相关文章

      网友评论

      • b2efe7751b24:为什么我上拉刷新的代码块只能进去一次
      • a6b25a69c9ca:写的很不错,
      • FengxinLi:请问一下怎么用这个第三方工具做到上来加载的时候 不出现加载框 然后就自动加载数据。就是淘宝上面滑动那种?
        PPAbner:@Fengxinliju 对,思路是正确的,我没有这样弄过。
        FengxinLi:@PPAbner 好的 谢谢了 如果想提早一点加载数据 就是还没到底部的时候 需要修改scrollViewContentOffsetDidChange 这个方法吗?
        PPAbner:@Fengxinliju
        #import "MJChiBaoZiFooter.h"

        @Implementation MJChiBaoZiFooter
        #pragma mark - 重写方法
        #pragma mark 基本设置
        - (void)prepare
        {
        [super prepare];

        // // 设置正在刷新状态的动画图片
        // NSMutableArray *refreshingImages = [NSMutableArray array];
        // for (NSUInteger i = 1; i<=10; i++) {
        // UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"load_view_0%ld", i]];
        // if (image) {
        // [refreshingImages addObject:image];
        // }
        //
        // }
        // [self setImages:refreshingImages forState:MJRefreshStateRefreshing];
        }
        @EnD
        自定义对应footer,然后 第一步把这个里面的注释掉(其实就是重写下prepare方法),起到的效果是:不显示菊花;第二步, MJChiBaoZiFooter *footer = [MJChiBaoZiFooter footerWithRefreshingTarget:self refreshingAction:@selector(hm_loadMoreSearchResult)];
        footer.refreshingTitleHidden = YES;
        _collectionView.footer = footer; 刷新时隐藏底部那个title
      • Andy1984:请问`_tableView.header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
        self.page = 0;

        [self updateData];
        }];`不会造成循环引用吗
        九剑仙:不会,除非block是自身的属性,并且是用copy修饰的,其他情况都不会出现循环应用,放心的用self吧,循环引用的话系统会提示
        PPAbner:@Andy1984 不会,我也跟你说不明白,你像UIView类方法的block 动画里,就不用这样,尽管用self,而这个地方,block 回掉时,在self.tableview里,有关联!:stuck_out_tongue_winking_eye:我自己都说的迷糊,你就当没看见!
        Andy1984:@Andy1984 你在UI控件的block里使用了strong self, 但是好像不会有循环引用问题, 请问这是为什么
      • 小冯哥:你这个数据请求在子线程中执行,刷新tableView的时候,不用回主线程更新么?
        小冯哥:@PP_Abner 额,之前一直以为都是在子线程的,今天测试了下,果然在主线程。。。 :smile:
        PPAbner:@小冯哥谢谢你的评论!
        PPAbner:@小冯哥 这个问题可以装逼下,你对AFN不熟悉,它的success会调自动给你切换到主线程!具体的你可以按着方法一路查询,有回调的!所以tableview刷新时已经在主线程了。
      • 5dac400fd463:if (1 == self.page) { // 说明是在重新请求数据.
        self.articles = nil;
        }

        楼主 这里的判断不应该是 0 ==self.page 吗?
        PPAbner:@vito0000 哦哦
        5dac400fd463:@PP_Abner 嗯嗯 , 明白了。谢谢。
        我看楼主上面代码: _tableView.header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
        self.page = 0;

        [self updateData];
        }];
        这里设置是0 后面是1 就觉得有点奇怪 嘿嘿
        PPAbner:@vito0000 根据你们后台,如果是从第0开始,就为0。是1就为1。一般都为0
      • FDZero:写的很好,感谢!不过我昨天遇到了一个问题就是如果我给tableView设置了tableHeaderView,那么tableHeaderView会覆盖掉刷新控件的视图,当然刷新控件的block还是执行了。后来,用[_tableView bringSubviewToFront:_tableView.mj_header]方法强行将刷新视图带到顶层,我想问有没有更好的方法能够兼容刷新视图和表头视图?
        PPAbner:@FDZero 解决啦好!棒:+1:🏻:+1:🏻:+1:🏻!
        FDZero:@PP_Abner 哦,解决了,因为我的tableHeaderView是仿照百度贴吧我的页面写的,在下拉的时候图片会拉伸,是图片拉伸后把刷新控件给遮挡住了,如果不拉伸图片就可以显示出刷新控件,但是效果就不是很好看 :blush:
        PPAbner:@FDZero 下午来了我有空给你看看好吧,马上中午要出去吃饭了!
      • 古斯比德:楼主,最新的mjrefresh代码中都是使用mj_header了吧
        PPAbner:@古斯比德 http://www.jianshu.com/p/4ea427bab0af [最新版]MJRefresh解析与详细使用指导
        PPAbner:@古斯比德 嗯嗯!
      • SYSYSY:兄弟啊,我根据你写的,放到项目里面,请求回来的数据有,可是数组里面就是没有,.我确定我添加到数组里面了?有什么联系方式能联系到你嘛??急求
        SYSYSY:@PP_Abner 好!!谢谢,,我已经发送到你的邮箱了
        PPAbner:@SYSYSY 公司不让扣扣,或者你在我微博私信我!
        PPAbner:@SYSYSY chinesemanbobo@163.com,你把你的发我邮箱,我等会给你立刻看看
      • 低调_哲: _tableView.header tableview 没有 header 这个属性啊 这个 怎么弄 ??
        PPAbner:@低调_哲 不会的!你如果遇到可以去买彩票(嘿嘿),顺便告诉我一下!tableView有的是tableHeaderView,它的分区有的是hesderVier,而这刷新控件是header
        低调_哲:@PP_Abner 哦 谢谢 如果我 写了 他的 分组headerView的方法 会冲突吗 和 这个下拉刷新操作
        PPAbner:@低调_哲 你导入MJRefresh后才有,实际上是UIScrollView的类目
      • 谁是我我我:感谢博主...使用起来很方便
        PPAbner:@谁是我我我 使用起来好用就好,好久没出来说话了!今天都回复!
      • Liusr:写的有点不详细吧 嘿嘿
        Liusr:@PP_Abner xie xie ni
        PPAbner:@LiuRR http://www.jianshu.com/p/4ea427bab0af [最新版]MJRefresh解析与详细使用指导,有什么不对的,欢迎指导!
        PPAbner:@LiuRR 我自己平时用到,但是这只是转的,没有自己写,有空了我写详细的!谢谢!
      • 奋斗的人儿:很好的第三方工具库

      本文标题:MJRefresh实现刷新(使用它的Block方法)

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