UITableView与MJRefresh

作者: Wy_chris | 来源:发表于2016-12-23 16:12 被阅读140次

    在实际项目中,很多控制器都是UITableview组成的,并且很多时候我们都要为其增加上下拉刷新的功能,之前写项目都是在每个控制器中去添加MJRefresh的代码,现在看起来真的是傻傻地。效果如下图 具体实现代码 demo

    photo.gif

    话不多少上代码 不知道咋说马的

    首先,创建一个基类 ViewCtr 声明tableView 以及数据源 自定义初始化方法,设置代理。

    @interface WYBaseViewCtr : UIViewController<UITableViewDelegate,UITableViewDataSource>
    @property(nonatomic,strong)UITableView *wTableView;
    @property(nonatomic,strong)NSMutableArray *data;
    @property(nonatomic,assign)NSInteger page;
    
    //初始化UITableView
    -(void)initTableViewFrame:(CGRect)frame WithStyle:(UITableViewStyle)style;
    //设置上下拉刷新(可在此方法类设置 上下拉样式)
    -(void)offerRefresh:(BOOL)refresh andLoadMore:(BOOL)loadMore;
    //展示错误信息页面
    -(void)showPageError:(BOOL)show withIsError:(BOOL)error;
    //请求数据 
    -(void)loadData;
    //重新获取数据
    -(void)resetGetData;
    

    .m文件
    初始化UITableView 设置frame style 以及是否提供上下拉刷新功能(如果不需要上拉加载,可更具需要自己调整代码)

    -(void)initTableViewFrame:(CGRect)frame WithStyle:(UITableViewStyle)style{
        self.wTableView = [[UITableView alloc] initWithFrame:frame style:style];
        _wTableView.delegate = self;
        _wTableView.dataSource = self;
     
        self.data = [NSMutableArray array];
        [self.view addSubview:_wTableView];
    }
    

    数据请求

    -(void)loadData{
        NSLog(@"调用父类");
      //在子类控制器中 直接重写该方法获取网络数据
    }
    

    设置添加上下拉刷新

    -(void)offerRefresh:(BOOL)refresh andLoadMore:(BOOL)loadMore{
        if (refresh) {
            _wTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(refresh)];
        }
        if (loadMore) {
            _wTableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
            _wTableView.mj_footer.automaticallyHidden = YES;
        } 
    }
    

    添加上下拉刷新数据代码

    -(void)refresh{
        self.page = 1;
        [self.data removeAllObjects];
        [self loadData];
        [self.wTableView.mj_header endRefreshing];
        [self.wTableView.mj_footer endRefreshing];
    }
    
    -(void)loadMoreData{
        self.page++;
        [self loadData];
        [self.wTableView.mj_header endRefreshing];
        [self.wTableView.mj_footer endRefreshing];
    }
    
    <UITableViewDelegate,UITableViewDataSource> //根据页面需求,重写代理方法即可
    

    在实际项目中,会出现网络请求失败或者数据列表中还没有数据需要给用户展示提示界面,为此增加了ErrorView的简单封装。

    Simulator Screen Shot 2016年12月23日 下午3.36.13.png

    这个比较简单就不说了。

    主要是通过block重新回到基类重新请求网络数据刷新页面,
    无数据时隐藏按钮即可

    在使用中,创建控制器继承自基类

    - (void)viewDidLoad {
        
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        self.navigationItem.title = @"上下拉刷新";
        [self initTableViewFrame:CGRectMake(0, 64, SCREEN_WIDTH, SCREEN_HEIGHT-64) WithStyle:UITableViewStyleGrouped];
         [self offerRefresh:NO andLoadMore:YES];
    
        [self.wTableView.mj_header beginRefreshing];   
    }
    //重写父类方法-获取数据源
    -(void)loadData{
        [super loadData];
      //根据需求获取不同的数据源
        for (NSInteger i = 0; i<10; i++) {
            [self.data addObject:@"123"];
        }
        [self.wTableView reloadData];
       //  加载数据失败或者无数据时调用  error = YES? 访问出错:暂无数据;
       //  [self showPageError:YES withIsError:YES];
    }
    
    //点击重新加载调用此方法
    -(void)resetGetData{
         [self.wTableView.mj_header beginRefreshing];    
    }
    

    相关文章

      网友评论

        本文标题:UITableView与MJRefresh

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