zoukankan      html  css  js  c++  java
  • 学习制作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];
            }
        }
        
    }
  • 相关阅读:
    Activity使用startActivityForResult时出现onActivityResult()不执行的问题
    Android AppWidget
    linux 条件变量
    effective c++:private继承
    effective c++:virtual函数的替代方案
    effective c++:inline函数,文件间编译依存关系
    effective c++:dynamic_cast,避免返回handles指向对象内部
    effective c++:引用传递与值传递,成员函数与非成员函数
    effective c++:资源管理
    effective c++:对象的赋值运算
  • 原文地址:https://www.cnblogs.com/randytech/p/5038780.html
Copyright © 2011-2022 走看看