//

//  LSTWholeTableController.m

//  BUDEJIE

//

//  Created by admin on 16/8/17.

//  Copyright © 2016年 ibokan. All rights reserved.

//

#import "LSTWholeTableController.h"

#import "AFNetworking.h"

#import "LSTWholeModal.h"

#import "MJExtension.h"

#import "SVProgressHUD.h"

@interface LSTWholeTableController ()

@property(nonatomic,weak)UIView * footerView;

@property(nonatomic,weak)UIView * headerView;

@property(nonatomic,weak)UILabel * footerLabel;

@property(nonatomic,weak)UILabel * headerLabel;

/**加载下一页数据**/

@property (nonatomic, copy) NSString *maxtime;

/**底部是否刷新**/

@property(nonatomic,assign,getter=isHeaderRefreshing)BOOL headerRefreshing;

/**Bool判断是否刷新**/

@property(nonatomic,assign,getter=isRefreshing)BOOL footerRefreshing;

/**模型数组**/

@property(nonatomic,strong)NSMutableArray * wholeData_array;

/**请求数据**/

@property(nonatomic,strong)AFHTTPSessionManager * manager;

@end

@implementation LSTWholeTableController

/**加载View**/

- (void)viewDidLoad {

[super viewDidLoad];

self.tableView.backgroundColor=[UIColor greenColor];

/**监听通知**/

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(tabBarButtonClick) name:TabBarButtonRepeatClickNotification object:nil];

[self setupRefresh];

[self loadData];

}

-(void)setupRefresh{

UIView * footerView=[[UIView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 35)];

UILabel * footerLabel=[[UILabel alloc]initWithFrame:footerView.bounds];

footerLabel.text=@"上拉加载更多";

footerLabel.textAlignment=NSTextAlignmentCenter;

footerLabel.backgroundColor=[UIColor orangeColor];

[footerView addSubview:footerLabel];

self.footerView=footerView;

self.footerLabel=footerLabel;

self.tableView.tableFooterView=footerView;

UILabel * label=[[UILabel alloc]initWithFrame:CGRectMake(0, 0, 0, 30)];

label.backgroundColor=[UIColor blackColor];

label.textColor=[UIColor whiteColor];

label.text=@"广告";

label.textAlignment=NSTextAlignmentCenter;

self.tableView.tableHeaderView=label;

/**头部**/

UIView * header=[[UIView alloc]init];

header.backgroundColor=[UIColor brownColor];

header.frame=CGRectMake(0, -50, SCREEN_WIDTH, 50);

self.headerView=header;

[self.tableView addSubview:header];

UILabel * headerLabel=[[UILabel alloc]init];

headerLabel.frame=header.bounds;

headerLabel.text=@"下拉可以刷新";

headerLabel.textColor=[UIColor whiteColor];

headerLabel.textAlignment=NSTextAlignmentCenter;

self.headerLabel=headerLabel;

[header addSubview:headerLabel];

// 让header自动进入刷新

[self headerBeginRefreshing];

}

- (void)headerBeginRefreshing

{

// 如果正在下拉刷新,直接返回

if (self.isHeaderRefreshing) return;

// 进入下拉刷新状态

self.headerLabel.text = @"正在刷新数据...";

self.headerLabel.backgroundColor = [UIColor blueColor];

self.headerRefreshing = YES;

// 增加内边距

[UIView animateWithDuration:0.25 animations:^{

UIEdgeInsets inset = self.tableView.contentInset;

inset.top += self.headerView.height;

self.tableView.contentInset = inset;

// 修改偏移量

self.tableView.contentOffset = CGPointMake(self.tableView.contentOffset.x,  - inset.top);

}];

// 发送请求给服务器,下拉刷新数据

[self loadData];

}

#pragma mark - 代理方法

/**

*  用户松开scrollView时调用

*/

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

{

CGFloat offsetY = - (self.tableView.contentInset.top + self.headerView.height);

if (self.tableView.contentOffset.y <= offsetY) { // header已经完全出现

[self headerBeginRefreshing];

}

}

-(AFHTTPSessionManager *)manager{

if (!_manager) {

_manager=[AFHTTPSessionManager manager];

}

return _manager;

}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

{

// 处理header

[self dealHeader];

// 处理footer

[self dealFooter];

}

/**

*  处理footer

*/

- (void)dealFooter

{

// 还没有任何内容的时候,不需要判断

if (self.tableView.contentSize.height == 0) return;

// 当scrollView的偏移量y值 >= offsetY时,代表footer已经完全出现

CGFloat ofsetY = self.tableView.contentSize.height + self.tableView.contentInset.bottom - self.tableView.height;

if (self.tableView.contentOffset.y >= ofsetY

&& self.tableView.contentOffset.y > - (self.tableView.contentInset.top)) { // footer完全出现,并且是往上拖拽

[self footerBeginRefreshing];

}

}

- (void)dealHeader

{

// 如果正在下拉刷新,直接返回

if (self.isHeaderRefreshing) return;

// 当scrollView的偏移量y值 <= offsetY时,代表header已经完全出现

CGFloat offsetY = - (self.tableView.contentInset.top + self.headerView.height);

if (self.tableView.contentOffset.y <= offsetY) { // header已经完全出现

self.headerLabel.text = @"松开立即刷新";

self.headerLabel.backgroundColor = [UIColor grayColor];

} else {

self.headerLabel.text = @"下拉可以刷新";

self.headerLabel.backgroundColor = [UIColor redColor];

}

}

- (void)headerEndRefreshing

{

self.headerRefreshing = NO;

// 减小内边距

[UIView animateWithDuration:0.25 animations:^{

UIEdgeInsets inset = self.tableView.contentInset;

inset.top -= self.headerView.height;

self.tableView.contentInset = inset;

}];

}

-(void)tabBarButtonClick{

if (self.view.window==nil) return;

if (self.tableView.scrollsToTop==NO) return;

}

-(void)dealloc{

[[NSNotificationCenter defaultCenter]removeObserver:self name:TabBarButtonRepeatClickNotification object:nil];

}

#pragma mark 加载数据

-(void)loadData{

NSMutableDictionary * parameters=[NSMutableDictionary dictionary];

parameters[@"a"]=@"list";

parameters[@"c"]=@"data";

parameters[@"type"]=@"1";

[self.manager GET:BaseURL parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, NSDictionary *  _Nullable responseObject) {

self.wholeData_array=[LSTWholeModal mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];

[self.tableView reloadData];

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

[SVProgressHUD showErrorWithStatus:@"网络异常,加载失败"];

}];

}

/**

*  发送请求给服务器,上拉加载更多数据

*/

- (void)loadMoreTopics

{

// 1.取消之前的请求

[self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];

// 2.拼接参数

NSMutableDictionary *parameters = [NSMutableDictionary dictionary];

parameters[@"a"] = @"list";

parameters[@"c"] = @"data";

parameters[@"type"] = @"31";

parameters[@"maxtime"] = self.maxtime;

// 3.发送请求

[self.manager GET:BaseURL parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {

// 存储maxtime

self.maxtime = responseObject[@"info"][@"maxtime"];

// 字典数组 -> 模型数据

NSArray *moreTopics = [LSTWholeModal mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];

// 累加到旧数组的后面

[self.wholeData_array addObjectsFromArray:moreTopics];

// 刷新表格

[self.tableView reloadData];

// 结束刷新

[self footerEndRefreshing];

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

if (error.code != NSURLErrorCancelled) { // 并非是取消任务导致的error,其他网络问题导致的error

[SVProgressHUD showErrorWithStatus:@"网络繁忙,请稍后再试!"];

}

// 结束刷新

[self footerEndRefreshing];

}];

}

- (void)footerEndRefreshing

{

self.footerRefreshing = NO;

self.footerLabel.text = @"上拉可以加载更多";

self.footerLabel.backgroundColor = [UIColor redColor];

}

#pragma mark - footer

- (void)footerBeginRefreshing

{

// 如果正在上拉刷新,直接返回

if (self.footerRefreshing) return;

// 进入刷新状态

self.footerRefreshing = YES;

self.footerLabel.text = @"正在加载更多数据...";

self.footerLabel.backgroundColor = [UIColor blueColor];

// 发送请求给服务器,上拉加载更多数据

[self loadMoreTopics];

}

#pragma mark - Table view data source

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

return self.wholeData_array.count;

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString * const ID=@"cell";

UITableViewCell * cell=[tableView dequeueReusableCellWithIdentifier:ID];

if (!cell) {

cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];

}

LSTWholeModal * wholeDateModal=self.wholeData_array[indexPath.row];

cell.textLabel.text=wholeDateModal.name;

cell.detailTextLabel.text=wholeDateModal.text;

return cell;

}

@end

自定义刷新tableView的更多相关文章

  1. MJRefresh自定义刷新动画

    [一]常见用法 最原始的用法,耦合度低,但是不能统一管理.我们需要在每一个控制器都写以下代码,很繁琐,以后项目修改起来更繁琐,得一个控制器一个控制器的去定位.修改. 1.1 使用默认刷新(耦合度底,但 ...

  2. 李洪强iOS开发之 - 指定刷新tableview的某一组

    李洪强iOS开发之 - 指定刷新tableview的某一组

  3. 在模型中获取网络数据,刷新tableView

    model .h #import <Foundation/Foundation.h> #import "AFHTTPRequestOperationManager.h" ...

  4. 刷新 tableview

    UITableView对于iOS开发者来说一定不会陌生,很有可能你的APP很多界面都用到它.关于UITableView的文章,想必已经不计其数,没事可以多看看.特别是UITableView优化的文章, ...

  5. iOS开发——UI进阶篇(四)tableView的全局刷新,局部刷新,左滑操作,左滑出现更多按钮,进入编辑模式,批量删除,自定义批量删除

    首先创建项目,在storyboard如下布局控件,设置好约束 然后创建cell模型类XMGWineCell数据模型类XMGWine创建UITableView,设置数据源协议,实现数据源方法懒加载数据这 ...

  6. IOS详解TableView——内置刷新,EGO,以及搜索显示控制器

    内置刷新 内置刷新是苹果IOS6以后才推出的一个API,主要是针对TableViewController增加了一个属性,refreshControl,所以如果想用这个内置下拉刷新的话,最好给你的Tab ...

  7. 自定义下拉刷新控件-CBStoreHouseRefreshControl

    本文转载至 http://www.cocoachina.com/ios/20141110/10177.html iOS开发自定义刷新CBStoreHouseRefres 介绍 这是一款在Storeho ...

  8. tableView左划自定义带图片按钮

    本方法实现的原理是将自定义按钮加在tableViewCell.contentView的屏幕外的frame上,打个比方,如果是5系的话,那么你自定义按钮的frame的起点就在(320+,0)(320+表 ...

  9. 如何对tableview进行自定义多选

    前言: 很多入门不久的程序员或许都会遇到系统自带的tableview多选时cell选择时不能选择自己想要的点击时的颜色或者图片,这让初级开发者们很烦恼.今天,我试着花了几个小时的时间用了自己的想法,去 ...

随机推荐

  1. JavaScript使用技巧(1)——JS常用的函数

    1.字符串对象函数和属性 函数: charAt():返回在指定位置的字符. charCodeAt():返回在指定的位置的字符的 Unicode 编码. concat():连接字符串. indexOf( ...

  2. word域3

    WORD是文字处理软件,我们在日常处理一些文字时经常遇到一些问题,如:各种公式的录入,尽管Word都提供了"公式编辑器",但其插入的却是"对象",有时排版会感觉 ...

  3. android Fragment 使用

    一 .Fragment的理解 Fragment 与activity 相似,但比activity 多出几个方法 ,Fragment的生命周期小于activity 一个Activity 中可以包含多个Fr ...

  4. 做Adsense的一些经验

    The payment you receive per click depends on how much advertisers are paying per click to advertise ...

  5. marquee 标签 文字滚动

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. Arduino 极速入门系列 - 光控灯(1)- 关于理论和 LED 那些事

    点个 LED 闪亮好像太单调,这次来个光控 LED 灯.这个其实不需要 Arduino 也能做,这次只是用来演示一下 PWM 在 Arduino 里面的做法.PWM 原理后面会解释.这次用充电宝提供 ...

  7. SQL函数

    1,字符串截取拼接 CONCAT(),'****');SUBSTRING_INDEX(c.context,'}',1);SUBSTRING_INDEX(a.task_context,':',-1) a ...

  8. Sprint(第八天11.21)

  9. win7 32位安装php redis驱动

    根据php版本下载php_redis扩展,然后把php_redis.dll这个扩展文件放到php中的ext文件夹中,然后再去php-ini中添加一行代码:extension=php_redis.dll ...

  10. ROWID伪列

    ROWID伪列概念: 在数据表中每一行所保存的记录,oracle会为每条记录分配一个唯一的地址编号,这个编号就是通过ROWID表示的. 所有的数据都利用ROWID进行定位. 观察rowid的存在 SQ ...