1. MJRefreshNormalHeader、MJRefreshAutoNormalFooter基本使用
2. 自定义XMGRefreshHeader、XMGRefreshFooter
3. 下拉刷新、上拉加载同时出现
如果下载刷新,然后进行上拉加载,触发上拉加载方法,
3.1. [self.manager.tasks makeObjectsPerformSelector:@selector(cancel)]; 首先取消下拉网络请求
3.2. 取消以后,那么网络请求 failure 中会回调, 结束上拉 self.mytableview.mj_header endRefreshing];
分页做法:
3.1. 传递page , 传递page到服务器,服务器临时插入数据,可能造成数据重复
3.2. maxId, 上一页最大值 ,不会造成数据重复
4. AFHTTPSessionManager 子类化
ViewController.
#import "ViewController.h"
#import <MJRefresh/MJRefresh.h>
#import "Person.h"
#import <AFNetworking/AFNetworking.h>
#import <MJExtension/MJExtension.h>
#import "XMGRefreshHeader.h"
#import "XMGRefreshFooter.h"
#import "XMGHTTPSessionManager.h"
@interface ViewController ()<UITableViewDelegate,UITableViewDataSource>
@property(nonatomic,strong) NSMutableArray* persons;
/** 任务管理者 */
//@property (nonatomic, strong) AFHTTPSessionManager *manager;
@property (nonatomic, strong) XMGHTTPSessionManager *manager;
@property (weak, nonatomic) IBOutlet UITableView *mytableview;
@end
@implementation ViewController
- (XMGHTTPSessionManager *)manager
{
if (!_manager) {
_manager = [XMGHTTPSessionManager manager];
}
return _manager;
}
-(NSMutableArray *)persons{
if(_persons== nil){
_persons = [[NSMutableArray alloc] init];
for (int i=0; i<100; i++) {
Person* p=[Person new];
p.id= i;
p.username=@"xiaoming";
[_persons addObject:p];
}
}
return _persons;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.mytableview.delegate=self;
self.mytableview.dataSource=self;
// block 代码块实现
// self.tableview.tableHeaderView=[MJRefreshHeader headerWithRefreshingBlock:<#^(void)refreshingBlock#>]
// 代理实现
MJRefreshNormalHeader* mj_header_1= [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadRefres)];
// 控制控件
mj_header_1.automaticallyChangeAlpha=true;
mj_header_1.lastUpdatedTimeLabel.hidden=YES;
// 设置文案
[mj_header_1 setTitle:@"赶紧下拉刷新吧" forState:MJRefreshStateIdle];
[mj_header_1 setTitle:@"赶紧松开吧" forState:MJRefreshStatePulling];
[mj_header_1 setTitle:@"正在加载数据..." forState:MJRefreshStateRefreshing];
// 使用自定义的
XMGRefreshHeader* xmg_header_1= [XMGRefreshHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadRefres)];
// self.mytableview.mj_header= mj_header_1;
self.mytableview.mj_header= xmg_header_1;
//自动下拉刷新
[xmg_header_1 beginRefreshing];
// 上拉加载更多
// self.mytableview.mj_footer= [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMore)];
self.mytableview.mj_footer= [XMGRefreshFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMore)];
}
int page= 0;
// 加载更多
-(void)loadMore{
// 取消所有请求
// for (NSURLSessionTask *task in self.manager.tasks) {
// [task cancel];
// }
[self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];
page= page+1;
NSDictionary *paramDict = @{
@"username":@"Cehae",
@"password":@"Cehae",
@"page": @(page)
};
// AFHTTPSessionManager* manager= [AFHTTPSessionManager manager];
// 1. AFN 发送 GET 请求
[self.manager POST:@"http://192.168.1.162:8080/JsonServlet/GsonServlet" parameters:paramDict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
//AFN 返回字典,直接字典转模型即可
// Person* person=[Person mj_objectWithKeyValues:responseObject];
NSMutableArray* moreArray= [Person mj_objectArrayWithKeyValuesArray:responseObject[@"result"]];
// 把moreArray 中的每一个元素取出来塞到persons中
[self.persons addObjectsFromArray:moreArray];
[self.mytableview.mj_footer endRefreshing ];
[self.mytableview reloadData];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[self.mytableview.mj_header endRefreshing];
NSLog(@"请求失败 - %@", error);
// 可以根据状态码 判断错误类型
if (error.code == NSURLErrorCancelled) {
// 取消了任务
} else {
// 是其他错误
}
}];
}
// 下拉刷新
-(void)loadRefres{
[self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];
NSDictionary *paramDict = @{
@"username":@"Cehae",
@"password":@"Cehae",
@"page":@"0"
}; //2.发送GET请求/*
// AFHTTPSessionManager* manager= [AFHTTPSessionManager manager];
// 1. AFN 发送 GET 请求
[self.manager POST:@"http://192.168.1.162:8080/JsonServlet/GsonServlet" parameters:paramDict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
//AFN 返回字典,直接字典转模型即可
// Person* person=[Person mj_objectWithKeyValues:responseObject];
self.persons= [Person mj_objectArrayWithKeyValuesArray:responseObject[@"result"]];
NSLog(@"person=%@",self.persons);
[self.mytableview.mj_header endRefreshing];
[self.mytableview reloadData];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[self.mytableview.mj_header endRefreshing];
NSLog(@"%@",error);
}];
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return [self.persons count];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString* identify=@"id_cell";
UITableViewCell* cell= [tableView dequeueReusableCellWithIdentifier:identify];
if(cell==nil){
cell= [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identify];
}
Person* p=self.persons[indexPath.row];
cell.textLabel.text=p.username;
return cell;
}
@end
XMGRefreshHeader.m
#import "XMGRefreshHeader.h"
#import "UIView+XMGExtension.h"
@interface XMGRefreshHeader()
@property(nonatomic,weak) UIImageView* logo;
@end
@implementation XMGRefreshHeader
- (void)prepare{
[super prepare];
self.automaticallyChangeAlpha = YES;
self.lastUpdatedTimeLabel.textColor = [UIColor orangeColor];
self.stateLabel.textColor = [UIColor orangeColor];
[self setTitle:@"赶紧下拉吧" forState:MJRefreshStateIdle];
[self setTitle:@"赶紧松开吧" forState:MJRefreshStatePulling];
[self setTitle:@"正在加载数据..." forState:MJRefreshStateRefreshing];
// self.lastUpdatedTimeLabel.hidden = YES;
// self.stateLabel.hidden = YES;
// [self addSubview:[[UISwitch alloc] init]];
// 有些公司在下拉头部添加公司logo
UIImageView *logo = [[UIImageView alloc] init];
logo.image = [UIImage imageNamed:@"logo"];
[self addSubview:logo];
self.logo = logo;
}
/**
* 摆放子控件
*/
- (void)placeSubviews
{
[super placeSubviews];
self.logo.xmg_width = self.xmg_width;
self.logo.xmg_height = 50;
self.logo.xmg_x = 0;
self.logo.xmg_y = - 50;
}
@end
XMGRefreshFooter.m
#import "XMGRefreshFooter.h"
@implementation XMGRefreshFooter
- (void)prepare
{
[super prepare];
self.stateLabael.textColor = [UIColor redColor];
[self addSubview:[UIButton buttonWithType:UIButtonTypeContactAdd]];
// 刷新控件出现一半就会进入刷新状态
// 值越大,离开刷新底部越远就刷新
// self.triggerAutomaticallyRefreshPercent = 0.5;
// 不要自动刷新
// 自动刷新,拖到后面就自动刷新了
self.automaticallyRefresh = NO;
}
@end
XMGHTTPSessionManager.m
#import "XMGHTTPSessionManager.h"
@implementation XMGHTTPSessionManager
- (instancetype)initWithBaseURL:(NSURL *)url
{
if (self = [super initWithBaseURL:url]) {
// self.securityPolicy.validatesDomainName = NO;
// self.responseSerializer = nil;
// self.requestSerializer = nil;
}
return self;
}
@end
源码地址: https://download.csdn.net/download/dreams_deng/12514344