ios mj_refresh 上拉、下拉、自定义header、footer、afn子类化

  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

猜你喜欢

转载自blog.csdn.net/dreams_deng/article/details/106691104