`
jsntghf
  • 浏览: 2528337 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

下拉刷新以及上拉加载更多

    博客分类:
  • iOS
阅读更多

以前,写了一篇文章:下拉刷新的实现,只讲到了下拉刷新的功能,这篇文章描述了下拉刷新以及上拉加载更多的功能。

 

这里只列出核心功能的代码,其他的代码请参考附件。

 

DemoTableViewController.h

 

#import <UIKit/UIKit.h>
#import "STableViewController.h"

@interface DemoTableViewController : STableViewController {
    NSMutableArray *items;
}

@end
  

DemoTableViewController.m

 

#import "DemoTableViewController.h"
#import "DemoTableHeaderView.h"
#import "DemoTableFooterView.h"

@interface DemoTableViewController ()
- (void) addItemsOnTop;
- (void) addItemsOnBottom;
- (NSString *) createRandomValue;
@end

@implementation DemoTableViewController

- (void) viewDidLoad {
    [super viewDidLoad];
    
    self.title = @"STableViewController Demo";
    [self.tableView setBackgroundColor:[UIColor lightGrayColor]];
    
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"DemoTableHeaderView" owner:self options:nil];
    DemoTableHeaderView *headerView = (DemoTableHeaderView *)[nib objectAtIndex:0];
    self.headerView = headerView;
    
    nib = [[NSBundle mainBundle] loadNibNamed:@"DemoTableFooterView" owner:self options:nil];
    DemoTableFooterView *footerView = (DemoTableFooterView *)[nib objectAtIndex:0];
    self.footerView = footerView;
    
    items = [[NSMutableArray alloc] init];
    for (int i = 0; i < 10; i++)
        [items addObject:[self createRandomValue]];
}

#pragma mark - Pull to Refresh

- (void) pinHeaderView {
    [super pinHeaderView];
    
    DemoTableHeaderView *hv = (DemoTableHeaderView *)self.headerView;
    [hv.activityIndicator startAnimating];
    hv.title.text = @"Loading...";
}

- (void) unpinHeaderView {
    [super unpinHeaderView];
    
    [[(DemoTableHeaderView *)self.headerView activityIndicator] stopAnimating];
}

- (void) headerViewDidScroll:(BOOL)willRefreshOnRelease scrollView:(UIScrollView *)scrollView {
    DemoTableHeaderView *hv = (DemoTableHeaderView *)self.headerView;
    if (willRefreshOnRelease)
        hv.title.text = @"Release to refresh...";
    else
        hv.title.text = @"Pull down to refresh...";
}

- (BOOL) refresh {
    if (![super refresh])
        return NO;
    
    [self performSelector:@selector(addItemsOnTop) withObject:nil afterDelay:2.0];
    
    return YES;
}

#pragma mark - Load More

- (void) willBeginLoadingMore {
    DemoTableFooterView *fv = (DemoTableFooterView *)self.footerView;
    [fv.activityIndicator startAnimating];
}

- (void) loadMoreCompleted {
    [super loadMoreCompleted];
    
    DemoTableFooterView *fv = (DemoTableFooterView *)self.footerView;
    [fv.activityIndicator stopAnimating];
    
    if (!self.canLoadMore) {
        fv.infoLabel.hidden = NO;
    }
}

- (BOOL) loadMore {
    if (![super loadMore])
        return NO;
    
    [self performSelector:@selector(addItemsOnBottom) withObject:nil afterDelay:2.0];
    
    return YES;
}

#pragma mark - Dummy data methods 

- (void) addItemsOnTop {
    for (int i = 0; i < 3; i++)
        [items insertObject:[self createRandomValue] atIndex:0];
    [self.tableView reloadData];
    
    [self refreshCompleted];
}

- (void) addItemsOnBottom {
    for (int i = 0; i < 5; i++)
        [items addObject:[self createRandomValue]];  
    
    [self.tableView reloadData];
    
    if (items.count > 50)
        self.canLoadMore = NO;
    else
        self.canLoadMore = YES;
    
    [self loadMoreCompleted];
}

- (NSString *) createRandomValue {
    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
    [dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
    
    return [NSString stringWithFormat:@"%@ %@", [dateFormatter stringFromDate:[NSDate date]],
            [NSNumber numberWithInt:rand()]];
}

#pragma mark - Standard TableView delegates

- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return items.count;
}

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                       reuseIdentifier:CellIdentifier] autorelease];
    }
    
    cell.textLabel.text = [items objectAtIndex:indexPath.row];  
    return cell;
}

@end
分享到:
评论
2 楼 wwwang89 2013-04-07  
楼主,你的demo里面 的代码跟博客里面的不一样,群殴确信你上传错位了,,是你前一篇博客 的demo,请楼主在重新上传一次,O(∩_∩)O谢谢
1 楼 nyh1006 2013-03-23  
最好加上注释!

相关推荐

    下拉刷新与上拉加载更多SwipeRefreshLayout

    在Android应用开发中,用户界面的交互体验是至关重要的,其中下拉刷新和上拉加载更多功能已经成为现代移动应用的标准特性。"下拉刷新与上拉加载更多SwipeRefreshLayout"是Android SDK提供的一种组件,用于实现这两种...

    jQuery移动端下拉刷新、上拉加载更多插件

    在移动设备上,为了优化用户体验,许多网页应用都采用了下拉刷新(Pull-to-Refresh)和上拉加载更多(Infinite Scroll)的功能。jQuery作为一款广泛使用的JavaScript库,提供了丰富的插件来支持这些特性。本篇文章将...

    安卓下拉刷新,上拉加载框架

    在Android应用开发中,下拉刷新和上拉加载更多功能是常见的UI交互设计,用于提升用户体验,让用户能够方便地获取最新或更多的数据。本篇将详细介绍一个专为Android设计的下拉刷新和上拉加载框架——Android-...

    自定义listview下拉刷新上拉加载更多以及与google官方的下拉刷新结合使用

    在Android开发中,ListView是常用的数据展示控件,但原生的ListView并不支持下拉刷新和上拉加载更多的功能。为了实现这些高级特性,开发者通常需要进行自定义或者使用第三方库。本教程将探讨如何自定义ListView实现...

    小程序swiper实现tab切换--下拉刷新、上拉加载更多.zip

    通过以上步骤,我们可以构建一个功能完备的小程序,提供丰富的交互体验,包括平滑的tab切换、实时的下拉刷新以及方便的上拉加载更多功能。在实际开发中,还需要根据具体业务需求进行定制和优化,确保小程序在性能和...

    listview,gridview,scrollview下拉刷新和上拉加载更多

    而下拉刷新和上拉加载更多的功能则为用户提供了更友好的交互体验,使得用户可以轻松获取更多内容,尤其是在数据流无限或者数量庞大的情况下。本文将详细讲解如何在这些控件中实现这两种功能。 一、下拉刷新 1. ...

    下拉刷新,上拉加载更多.zip

    在移动应用开发中,"下拉刷新,上拉加载更多"是常见的交互设计模式,尤其在列表或数据流展示中非常普遍。这个功能允许用户通过简单的手势更新内容(下拉刷新)或者查看更多的数据(上拉加载更多)。下面将详细探讨这...

    几种方法实现下拉刷新,上拉加载

    在Android应用开发中,下拉刷新和上拉加载是提高用户体验的重要特性,它们使得用户能够方便地获取更多数据而无需离开当前界面。本篇将详细讲解如何使用Android Studio实现这三种不同的下拉刷新和上拉加载功能:...

    QT-QML下拉刷新上拉加载更多(仿京东app)

    总的来说,实现QML下的下拉刷新和上拉加载更多功能,需要结合`ListView`的事件监听、自定义组件、边界检测、数据模型操作以及异步网络请求等技术。通过`CCListViewDemo`这样的示例,开发者可以学习到如何在QT QML...

    RecyclerView搭配SwipeRefreshLayout和BaseQuickAdapter万能适配器实现下拉刷新和上拉加载更多

    下面将详细解释如何将这三个组件结合起来实现下拉刷新和上拉加载更多的功能。 1. **RecyclerView**: RecyclerView是Android Lollipop引入的替代ListView的新组件。相比于ListView,RecyclerView提供了更好的性能...

    自定义listview下拉刷新上拉加载更多以及google官方的下拉刷新

    综上,自定义ListView的下拉刷新和上拉加载更多功能,以及使用Google的SwipeRefreshLayout,都是Android开发中提升用户体验的重要手段。通过理解其工作原理和实践技巧,我们可以创建更高效、友好的应用界面。

    Materal风格之recycleView下拉刷新以及上拉加载更多

    总结起来,实现Material风格下的RecyclerView下拉刷新和上拉加载更多,主要涉及SwipeRefreshLayout和LoadMoreWrapper的使用,以及在Adapter中处理数据加载逻辑。通过这种方式,我们可以创建一个响应式、动态的列表,...

    仿糗事百科侧滑、下拉刷新、上拉加载更多

    "仿糗事百科侧滑、下拉刷新、上拉加载更多"这个项目是针对移动应用开发中的常见功能进行的模仿与实现,主要涉及到三个方面:侧滑菜单、下拉刷新以及上拉加载更多。这些功能在许多社交、资讯类应用中被广泛使用,为...

    Android下拉刷新上拉加载更多

    在Android应用开发中,"下拉刷新"和"上拉加载更多"是常见的用户体验功能,尤其是在数据列表场景中,如新闻、社交媒体或者电商应用。这两个功能使得用户可以方便地获取新内容或者查看历史数据,无需离开当前页面。...

    下拉刷新,上拉加载更多

    在微信小程序开发中,"下拉刷新"和"上拉加载更多"是常见的滚动操作功能,它们极大地提升了用户体验,使得用户能便捷地获取更多数据。本文将深入探讨这两个功能的实现原理、步骤以及相关的文件配置。 一、下拉刷新...

    uniapp实现下拉刷新及上拉加载更多的完整代码(app,H5,小程序均可使用)

    内容概要:uniapp实现下拉刷新及上拉加载更多的完整代码(app,H5,小程序均可使用),下载后解压,使用HBuilder导入项目即可运行。 适合人群:少许编程基础人员即可. 适应场景:需要使用uniapp开发移动端时,涉及...

    vue移动端列表组件支持下拉刷新上拉加载更多

    在Vue.js移动端应用开发中,实现列表滚动时的下拉刷新和上拉加载更多功能是常见的需求,这能提供良好的用户体验,特别是在数据量大或实时更新的场景下。本篇文章将详细探讨如何在Vue.js中构建这样的功能。 一、基础...

    基于 Android 的 BGARefreshLayout 下拉刷新与上拉加载更多组件.zip

    基于 Android 的 BGARefreshLayout 下拉刷新与上拉加载更多组件 项目简介 BGARefreshLayout 是一个基于 Android 平台的下拉刷新与上拉加载更多组件。它支持多种下拉刷新效果和上拉加载更多效果,并且允许开发者...

Global site tag (gtag.js) - Google Analytics