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]; } } }