美文网首页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