IOS学习之UiTableView下拉刷新与自动加载更多,百年不变的效果

Posted ios4

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS学习之UiTableView下拉刷新与自动加载更多,百年不变的效果相关的知识,希望对你有一定的参考价值。

ios学习之UiTableView下拉刷新与自动加载更多,百年不变的效果(五)

五一劳动节马上来临,小伙伴有妹有很激动哟,首先祝天下所有的程序猿节日快乐!这个五一对于我来说有点不一样,我的人生从这个五一就转弯了,爱情长跑8年的我结婚了,一会支付宝账号我会公布出去,请自觉打款!谢谢合作。

灯光闪起来:技术分享技术分享

舞蹈跳起来:技术分享技术分享

歌曲唱起来:技术分享

----------------------------------------------------------------------------------------------------------------------------------------------------------

智能世界的里面,做多的是什么?对,是APP,铺天盖地的APP随之袭来,APP死亡潮也随之出现,我们生活在互联网的时代里,每个人都是产品经理,据说,我们每天用的APP不超过8个,反正我每天必用百度云,你懂得,虽然APP多,但是他们都有一个共同点,你们知道是什么?你们千万不要告诉我是用手机玩的,他们就是都下拉刷新和加载更多,这些产品经理所有的共同点,虽然下拉刷新的动画都不一样,但是他们的目的只有个,就是获取服务器最最新的数据,我们都知道android里面有很多开源的下拉刷新的第三方比如有名的:Android-PullToRefresh。这个开源的很强大啊,支持很多控件,ListView、ViewPager、WevView、ExpandableListView、GridView、(Horizontal )ScrollView、Fragment 点击下载,当然你也可以自己写!既然是土豪的玩的IOS,怎么可能少了第三方的下拉刷新:但是比较有名的就是:EGOTableViewPullRefresh跟MJRefresh点击下载1------------点击下载2。我自认为上拉加载更多对用户简直是一直折磨,翻到最后一页,竟然还要上拉一下才能加载更多。一点也不顺畅,但是我感觉自动加载更多比较人性化,感觉很顺!自己的观点而已!下面我是使MJRefresh这个来学习的,自己集成的自动加载更多,下面来效果图:

技术分享

我们发现我们不需要上拉就可以自动加载更多,我感觉这种用户体验比较好:

继承步骤:

1:首先我们需要把MJRefresh这个开源的项目下载,把里面技术分享

全部考进自己的项目中,要先把这个文件拷贝到自己的项目的目录中,在xcode上右键add file这个文件我们才能把这个所需要的文件考进来,

2:实现:直接看代码:

 

//
//  ViewController.m
//  MyUitableViewRefreshAndMore
//
//  Created by xiaoyuan on 15/4/28.
//  Copyright (c) 2015年 xiaoyuan. All rights reserved.
//

#import "MyUitableViewRefreshViewController.h"
#import "MJRefresh.h"
#import "DataSingleton.h"

static const CGFloat MJDuration = 1.0;
//#define MJRandomData [NSString stringWithFormat:@"随机数据---%d", arc4random_uniform(1000000)]
#define DISPATCH_TIME_NOW (0ull)
#define NSEC_PER_SEC 1000000000ull


@interface MyUitableViewRefreshViewController ()<UITableViewDelegate,UITableViewDataSource>

{
    

    UITableView *table;
    NSMutableArray *data;
    //判断是否加载完成
    BOOL isLoadIOver;
    
}

@end

@implementation MyUitableViewRefreshViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    
    self .view .backgroundColor = [UIColor whiteColor];
    self.navigationController.navigationBar.barTintColor = [UIColor redColor];
    UILabel*title = [[UILabel alloc] initWithFrame:CGRectZero];
    title.text = @"刷新吧小宇宙";
    title.backgroundColor =[UIColor clearColor];
    title.textColor = [UIColor whiteColor];
    self.navigationItem.titleView = title;
    [title sizeToFit];
    
    
    
    
    [self.navigationController.navigationBar setTranslucent:NO];
    __weak typeof(self) weakSelf = self;
    
    if(data == nil){
        data  = [[NSMutableArray alloc] init];
        
    }
    self.view.backgroundColor = [UIColor whiteColor];
    table = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds];
    table.backgroundColor =[UIColor whiteColor];
    table.separatorStyle = UITableViewCellEditingStyleNone;
    table.delegate =self;
    table.dataSource =self;
    [self.view addSubview:table];
    [table addLegendHeaderWithRefreshingBlock:^{
        [weakSelf loadNewData :YES];
    }];
    
    // 进入自动刷新
    [table.legendHeader beginRefreshing];
    
    
    
}



- (void)loadNewData:(BOOL)reresh
{
    isLoadIOver = NO;
    //刷新移除所有数据
    if(reresh){
        [data removeAllObjects];
    
    }
    
    // 1.添加假数据
    for (int i = 0; i<20; i++) {
        [data addObject:@(i)];
       
    }
    
    // 2.模拟2秒后刷新表格UI(真实开发中,可以移除这段gcd代码)
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(MJDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        // 刷新表格
        [table reloadData];
        isLoadIOver = YES;
        // 拿到当前的下拉刷新控件,结束刷新状态
        [table.header endRefreshing];
    });
}




-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    //只要大于的数是小于第一次返回的个数就行
    return data.count > 10? data.count + 1 : data.count;
    
}


//
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    
    return  1;
    
}

-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return  44;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    if([data count]>0){
        if(indexPath.row<[data count]){
            static NSString *CellIdentifier [email protected]"Cell";
            
            
            
            UITableViewCell*cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
            
            
            
            if(cell == nil){
                
                cell = [[ UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
                //避免点击把分割线搞掉
                cell.selectionStyle = UITableViewCellSelectionStyleNone;
               
                //这个千万要记住写小于44,因为系统默认的就是44 ,这个把我坑坏了,一直找不到原因,一直以为重用的原因
                //大于44就超出高度,系统就给回收掉了
                
                UIView*view= [[UIView alloc] initWithFrame:CGRectMake(0, 43, 400, 1)];
                view.backgroundColor = [UIColor grayColor];
                [cell addSubview:view];

                
            }
             cell.textLabel.text = [NSString stringWithFormat:@"%@",[data objectAtIndex:indexPath.row]];
            cell .textLabel.textAlignment = NSTextAlignmentCenter;
                return cell;
            
        }
    }
    
    
    //加载更多
    if(isLoadIOver){
    [self loadNewData:NO];
    
    }
    
    return [DataSingleton.Instance getLoadMoreCell:table andIsLoadOver:NO andLoadOverString:@"正在加载..." andLoadingString:(YES ? @"正在加载" : @"下面10个") andIsLoading:YES];

}




- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}




@end

 

DataSingleton类:

 

//
//  DataSingleton.h
//  MyUiTableRefresh
//
//  Created by xiaoyuan on 15/4/29.
//  Copyright (c) 2015年 xiaoyuan. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "LoadingCell.h"

@interface DataSingleton : NSObject

#pragma 单例模式
+ (DataSingleton *) Instance;
+ (id)allocWithZone:(NSZone *)zone;

//返回标示正在加载的选项
- (UITableViewCell *)getLoadMoreCell:(UITableView *)tableView
                       andIsLoadOver:(BOOL)isLoadOver
                   andLoadOverString:(NSString *)loadOverString
                    andLoadingString:(NSString *)loadingString
                        andIsLoading:(BOOL)isLoading;

@end
//
//  DataSingleton.m
//  MyUiTableRefresh
//
//  Created by xiaoyuan on 15/4/29.
//  Copyright (c) 2015年 xiaoyuan. All rights reserved.
//

#import "DataSingleton.h"
#import <QuartzCore/QuartzCore.h>

@implementation DataSingleton

- (UITableViewCell *)getLoadMoreCell:(UITableView *)tableView
                       andIsLoadOver:(BOOL)isLoadOver
                   andLoadOverString:(NSString *)loadOverString
                    andLoadingString:(NSString *)loadingString
                        andIsLoading:(BOOL)isLoading
{
    LoadingCell * cell = [tableView dequeueReusableCellWithIdentifier:@"loadingCell"];
    if (!cell) {
        NSArray *objects = [[NSBundle mainBundle] loadNibNamed:@"LoadingCell" owner:self options:nil];
        for (NSObject *o in objects) {
            if ([o isKindOfClass:[LoadingCell class]]) {
                cell = (LoadingCell *)o;
                break;
            }
        }
    }
    cell.lbl.font = [UIFont boldSystemFontOfSize:15 - 2];
    cell.lbl.text = isLoadOver ? loadOverString : loadingString;
    if (isLoading) {
        cell.loading.hidden = NO;
        [cell.loading startAnimating];
    }
    else
    {
        cell.loading.hidden = YES;
        [cell.loading stopAnimating];
    }
    return cell;
}

#pragma 单例模式定义
static DataSingleton * instance = nil;
+(DataSingleton *) Instance
{
    if(nil == instance) {
        @synchronized(self) {
            if(nil == instance) {
                instance = [[DataSingleton alloc] init];
            }
        }
    }
    return instance;
}

//-(void) dealloc
//{
//    [instance release];
//    [super dealloc];
//}
+(id)allocWithZone:(NSZone *)zone
{
    @synchronized(self)
    {
        if(instance == nil)
        {
            instance = [super allocWithZone:zone];
            return instance;
        }
    }
    return nil;
}
@end


主要代码就是这些,还有一个LoadingCell类,就不贴了,这主要是MJReresh得基础上加上自动加载,当然里面还有一些逻辑需要待开发的,比如网络的原因了,还有数据全部加载完成了,这些就看需求来改!最后感谢李明杰老师,开源了这么优秀的代码。祝大家五一快乐,东北走起,求偶遇!


以上是关于IOS学习之UiTableView下拉刷新与自动加载更多,百年不变的效果的主要内容,如果未能解决你的问题,请参考以下文章

IOS学习之UITableView滚动到指定位置

IOS怎么实现一个UITableView的下拉刷新

ios UITableView刷新TableCell问题

CSS前段学习之加个下拉列表

iOS UITableView-下拉刷新上拉加载

iOS UITableView-下拉刷新上拉加载