//

//  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. tomcat 配置客户端证书认证

    在完成配置客户端证书认证后,浏览器以https访问服务器的时候,会提示选择证书,之后,服务器端会验证证书.也就意味着只有拥有有效证书的客户端才能打开该网站. 以下是具体的配置过程. 1. 在服务器端生 ...

  2. 《Spring MVC学习指南》怎么样?答:书名具有很大的欺骗性

    2016年6月21日 最近,因为工作需要,我从网上买了一本<Spring MVC学习指南>,ISBN编号: 978-7-115-38639-7,定价:49.00元.此书是[美]Paul D ...

  3. 5.对与表与表之间的关系,efcore是如何处理的

    public class Account { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Accoun ...

  4. 关于Struts、hibernate、spring三大框架详解。

    struts 控制用的 hibernate 操作数据库的 spring 用解耦的 Struts . spring . Hibernate 在各层的作用 1 ) struts 负责 web 层 . Ac ...

  5. CSS里width: auto\9 是什么意思

    color:red;//一般浏览器识别,字体颜色为红color:blue \9;//IE8,IE9及以上版本识别,字体颜色为蓝*color:orange;//IE7识别,字体颜色为橘色_color:b ...

  6. CentOS6.5安装Nginx

    1.安装prce(重定向支持)和openssl(https支持,如果不需要https可以不安装.) yum -y install pcre* yum -y install openssl* 2.下载n ...

  7. Strus2第一次课:dom4j解析xml文档

    xml文本标记语言: 常用于交换数据:独立于操作系统.编程语言数据存储:xml数据配置:灵活性强,可读性高可以使用css样式改变xml样式 xml解析技术:dom解析xml技术: sax解析xml技术 ...

  8. 使用Angularjs的ng-cloak指令避免页面乱码

    在使用Anguarjs进行web开发或者进行SPA(single page application)开发时,往往会遇到下面这样的问题. 刷新页面时,页面会出现一些乱码,这里的乱码具体是指`{{expr ...

  9. apt-get 与 yum 的区别

    一般来说著名的 linux 系统基本上分两大类: RedHat系列:Redhat.CentOS.Fedora等 Debian系列:Debian.Ubuntu等 RedHat 系列 1 常见的安装包格式 ...

  10. CSRF token 无法被验证. ----Yii连接数据库后数据库错误日志报错

    CSRF token 无法被验证. 我使用的是mongodb+ yii1.1 What is CSRF, please see the details here.  http://en.wikiped ...