学习制作iOS程序第十天:新闻列表页无数据提醒、上拉加载、下拉刷新(28~29)

28:无数据提醒

当我们访问新闻列表的时候,如果无数据会显示一片空白,客户体验不好,因为客户也不知道到底是没数据还是服务器错误数据加载失败了,所以需要给予无数据的提醒。

1、先建立一个通用类用来展示没有数据的结果,我叫RDBaseNoDataView,继承自UIView

#import <UIKit/UIKit.h>

@interface RDBaseNoDataView : UIView

@end
#import "RDBaseNoDataView.h"

@implementation RDBaseNoDataView

#pragma mark 重写初始化方法
-(id)initWithFrame:(CGRect)frame
{
    if (self=[super initWithFrame:frame]) {
        self.backgroundColor = BASE_COLOR_BGGRAY;
        
        UIImageView *imgview = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"common_noresult"]];
        imgview.contentMode = UIViewContentModeBottom;
        imgview.frame=CGRectMake(0, 0, frame.size.width, frame.size.height / 2 - 40);
        [self addSubview:imgview];
        
        UILabel *lbltxt = [[UILabel alloc] initWithFrame:CGRectMake(0, frame.size.height / 2 - 10, frame.size.width, 50)];
        lbltxt.text=@"没有找到数据
请尝试换个条件";
        lbltxt.numberOfLines=2;
        lbltxt.font=[UIFont systemFontOfSize:16];
        lbltxt.textColor = [UIColor grayColor];
        lbltxt.textAlignment=NSTextAlignmentCenter;
        [self addSubview:lbltxt];
        
    }
    return self;
}

@end

2、定义变量并初始化为隐藏

RDBaseNoDataView *nodataview;
    //初始化nodataview
    nodataview = [[RDBaseNoDataView alloc] initWithFrame:_tableView.frame];
    [self.view addSubview:nodataview];
    [nodataview setHidden:YES];

3、当数据加载完成之后进行判断是否需要展示initDataWithDict方法里

-(void)initDataWithDict:(NSDictionary *)dict
{
    //如果获取的是第一页的数据,表示刚进入该view或者刷新该view
    if (pageindex==1) { [arrNewsList removeAllObjects]; }
    
    NSArray *arrnews = [dict objectForKey:@"NewsList"];
    
    for (NSDictionary *dic in arrnews) {
        NewsListModel *modnews = [[NewsListModel alloc]initWithDict:dic];
        [arrNewsList addObject:modnews];
    }
    
    if (pageindex==1 && arrNewsList.count == 0) {
        [nodataview setHidden:NO];
    }else{
        [nodataview setHidden:YES];
        [_tableView reloadData];
    }
    
    if ([_tableView.mj_header isRefreshing]) { [_tableView.mj_header endRefreshing]; }
    if ([_tableView.mj_footer isRefreshing]) {
        if (arrNewsList.count >= totalrecord) {
            [_tableView.mj_footer endRefreshingWithNoMoreData];
        }else{
            [_tableView.mj_footer endRefreshing];
        }
    }
    
}

29、上拉加载更多,下拉刷新

和传统的Web页面不一样,Web页面一般多用分页来进行展示,而APP多用下拉刷新和上拉加载更多来进行展示。我用的是MJRefresh

1、定义变量,用来标示页码、每页展示数量、总数

@interface RDNewsListViewController ()<UITableViewDataSource,UITableViewDelegate,HttpHelperDelegate>
{
    HttpHelper *helper;
    NSMutableArray *arrNewsList;
    NSMutableDictionary *searchdict;
    
    NSUInteger pageindex;
    NSUInteger pagesize;
    NSUInteger totalrecord;
    
    RDBaseNoDataView *nodataview;
}
@end

2、初始化这三个数据

    pagesize=15;
    pageindex=1;
    totalrecord = 0;

3、加入下拉刷新和上拉加载的函数

    //加入上拉加载和下拉刷新
    _tableView.mj_header=[MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(ReloadData)];
    _tableView.mj_footer=[MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(LoadMore)];

4、刷新方法和加载更多的方法

-(void)ReloadData
{
    pageindex = 1;
    [searchdict setValue:@"1" forKey:@"pageindex"];
    [helper GetNewsListWithHUD:NO andDict:searchdict];
}
-(void)LoadMore
{
    pageindex = pageindex + 1;
    [searchdict setValue:[NSString stringWithFormat:@"%lu",pageindex] forKey:@"pageindex"];
    [helper GetNewsListWithHUD:NO andDict:searchdict];
}

5、httphelper代理函数要做一点更改

网络请求出错的时候关闭下拉刷新条和上拉加载更多条

网络请求成功的时候返回数据总量

#pragma mark - 实现httphelper代理
-(void)HttpExecuteFailure:(AFHTTPRequestOperation *)operation andError:(NSError *)error andFlag:(NSString *)flag
{
    NSLog(@"ERROR=%@",error);
    if ([_tableView.mj_header isRefreshing]) { [_tableView.mj_header endRefreshing]; }
    if ([_tableView.mj_footer isRefreshing]) { [_tableView.mj_footer endRefreshing]; }
    [self.view makeToast:@"服务器错误,请稍候再试。" duration:3.0 position:CSToastPositionCenter];
}
-(void)HttpExecuteSuccess:(AFHTTPRequestOperation *)operation andResponseObject:(id)responseObject andFlag:(NSString *)flag
{
    //NSLog(@"SUCCESS=%@",responseObject);
    NSDictionary *dict = (NSDictionary *)responseObject;
    if (1 == [[dict objectForKey:@"success"] integerValue]) {
        [self initDataWithDict:dict];
        totalrecord = [[dict objectForKey:@"TotalRecord"] integerValue];
    }else{
        [self.view makeToast:[dict objectForKey:@"msg"] duration:3.0 position:CSToastPositionCenter];
    }
}

6、initDataWithDict方法也需要做一些更改

网络请求成功的时候关闭下拉刷新条和上拉加载更多条

如果当前数据等于数据总数,底部提示全部数据加载完成,不再调用加载更多方法

-(void)initDataWithDict:(NSDictionary *)dict
{
    //如果获取的是第一页的数据,表示刚进入该view或者刷新该view
    if (pageindex==1) { [arrNewsList removeAllObjects]; }
    
    NSArray *arrnews = [dict objectForKey:@"NewsList"];
    
    for (NSDictionary *dic in arrnews) {
        NewsListModel *modnews = [[NewsListModel alloc]initWithDict:dic];
        [arrNewsList addObject:modnews];
    }
    
    if (pageindex==1 && arrNewsList.count == 0) {
        [nodataview setHidden:NO];
    }else{
        [nodataview setHidden:YES];
        [_tableView reloadData];
    }
    
    if ([_tableView.mj_header isRefreshing]) { [_tableView.mj_header endRefreshing]; }
    if ([_tableView.mj_footer isRefreshing]) {
        if (arrNewsList.count >= totalrecord) {
            [_tableView.mj_footer endRefreshingWithNoMoreData];
        }else{
            [_tableView.mj_footer endRefreshing];
        }
    }
    
}
原文地址:https://www.cnblogs.com/randytech/p/5038780.html